shell脚本学习-05

79.文本操作命令:sed awk

这些命令操作文本时,是一行一行地处理的,如果该行匹配到了关键字或者正则表达式,那么该行被接受并打印在屏幕上,然后读取下一行并进行操作。
sed操作符不会修改原本的文件,如果想得到过滤后的结果,需要重定向到其他文件中。
sed过滤打印的语法格式:

sed -n '/Regular_Expression/p' filename
sed -n '/Mango/p' filename

sed替换字符串的语法格式:
即使替换后,原始文本文件还是不会动的。

sed -n 's/RE/replacement string/' filename
sed -n 's/Mango/Apple/' filename
Metacharacter Function
^ 指定一行的开头字符
$ 指定一行的结尾字符
. 匹配一个字符,但不是某行的开头字符
* 匹配0个或多个字符
[] 匹配中括号集合内的一个字符
[^] 匹配非中括号集合内的任一个字符
(…) 保存匹配到的字符
& 保存匹配到的字符串,这样就可以在替代字符串中拿到,下面有个例子就用到了&
< 一个单词的开头
> 一个单词的结尾
x{m} 字符x的重复个数
x{m,} 字符x至少重复个数
x{m,n} 字符x重复m到n个之间

80.addressing in sed

sed 'command' filename
这样会删除掉1-3行
cat myfile | sed '1,3d'
sed '1,3d' myfile
打印item.list文件中的包含apple或者Apple的行,注意是打印整行
sed -n '/[Aa]pple/p' item.list
删除匹配到的行
sed '/Apple/d' item.list

删除未匹配到的行
sed '/Apple/!d' item.list 

因为sed命令并不会修改原文件,所以只能将输出重定向到临时文件.

sed '1,3d' datafile > tempfile
mv tempfile newfile

-n:是否显示默认输出

sed的-p命令在输出时,是默认将文本文件中的读取的每一行都输出到终端的,包括匹配到的和未匹配到的,那么如何控制sed命令只输出匹配到的呢?so,-n 命令能做到。
格式:

sed -n '/USA/p' country.txt #将只输出包含USA的行

-d:删除匹配到的行。

sed '3d' country.txt #删除掉第3行
sed '3,$d' country.txt#删除掉3-last行 $:最后一行
sed '$d' country.txt#删除最后一行
sed '/Japan/d' country.txt #删掉匹配到japan的行
sed '/Japan/!d' country.txt #删掉没匹配到japan的行
sed '4,+5d' #删除第4行,以及接下来的5行
sed '1,5!d' #留住1-5行,删除所有的其他行
sed '1~3d' # 删除1,4,7...  3的等差数列
sed '2~2d' #删除偶数行

-s:替换命令

语法格式:

sed 's/Caashew/Almonds/g' shopping.txt #将文件中的Cashew替换为Almonds,如果不加g,只替换第一个

例子:

sed 's/[0-9][0-9]$/&.5/' #匹配规则:以2个数字结尾;替换规则:在后面加上.5  注意&字符代表前面匹配到的两个数字。

,:范围限制

‘6d’:第6行
‘3,6d’:第3-6行
‘/pattern1/,/pattern2/’:格式1和格式2之间的所有行
‘/pattern1/,4’:格式1和第4行之间
例子:

cat country.txt
output:
Country Capital   ISD Code
USA     Washington  1
China   Beijing     86
Japan   Tokyo       81
India   Delhi       91

sed -n '/USA/,/Japan/p' country.txt
output:
USA     Washington  1
China   Beijing     86
Japan   Tokyo       81

sed -n '2,/India/p' country.txt
output:
USA     Washington  1
China   Beijing     86
Japan   Tokyo       81
India   Delhi       91
cat shopping.txt
output:
Product     Quantity  Unit_Price  Total_Cost
Apple       2          3            6
Orange      2          .8           1.6
Papaya      2          1.5          3
Chicken     3          5            15.5
Cashew      1          10           10.5

#这条命令分2部分:
第一部分:'/Apple/,/Papaya/' 表示匹配两个pattern之间的行
第二部分:'s/$/*** out of stock ***/' 表示替换经过第一个命令过滤后的行
sed '/Apple/,/Papaya/s/$/**    Out of stock   ***/' shopping.txt
output:
Product     Quantity  Unit_Price  Total_Cost
Apple       2          3            6**    Out of stock   ***
Orange      2          .8           1.6**    Out of stock   ***
Papaya      2          1.5          3**    Out of stock   ***
Chicken     3          5            15.5
Cashew      1          10           10.5

-e:连接多个命令

连续执行多个命令
语法:
sed -e command1 -e command2 -e conmmand3 fileName

sed -e '5d' -e 's/Cashew/Almonds/' shopping.txt

-r:将一个文件中的内容插入到另一个文件中(只是在终端打印出结果,并不会真正的改变目标文件)。

语法:
sed ‘/Apple/r new.txt’ shopping.txt # 表示将new.txt中的内容插入到shopping.txt中匹配到Apple的行后面

-w:将一个文件中的内容写入到另一个文件中,会执行写入操作,真正得改变文件。

语法
sed -n ‘/Chicken/w new.txt’ shopping.txt
将shopping.txt中匹配到Chicken的行的文本写到new.txt中

a:append命令,添加一行到文件中(并不会真的修改文件),插入到匹配的行的后面。

语法:

在shopping.txt的匹配到oragne的行后面插入这句话。
sed '/Orange/a\
***** Buy one get one free offer on this item!*****' shopping.txt

i:与a命令一样,插入行到文件中,不过插入到匹配的行的前面。

语法:

sed '/Apple/i\
New prices will apply from Next month! ' shopping.txt

c:替换文本内容,使用指定的内容来替换匹配到的整行。

语法:

sed '/Papaya/c\
Papaya is out of stock today !
' shopping.txt

y:字符转换操作符。

语法:y前面是范围限定符

sed '2,4y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRS
TUVWXYZ/' shopping.txt

sed '/Apple/,/Chicken/y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' shopping.txt

q:退出sed处理程序,不再执行接下来的行

sed '3q' shopping.txt #只打印前3行

h 和 g: 存储与取回命令。g会将存储的内容append到文本的最后面。

sed -e '/Product/h' -e '$g' shopping.txt #与s命令中的&的区别是,&可以获取匹配到的字符串,而h/g是获取匹配到的整行。

h和x:存储与替换命令。x会用存储的内容替换掉匹配到的内容。

sed -e '/Apple/h' -e '/Cashew/x' shopping.txt # Cashew行将会被Apple行替换掉。

81.sed脚本。

语法格式:

sed -f sed_script_name target.txt

sed脚本中:
每个命令要换行的话,用\换行;
多个命令,想不换行的话,用:隔开。

# 第一个sed脚本
# 在第一行之前插入
1i\
Stock status report
/Orange/a\
Fresh Oranges are not available in this season. \
Fresh Oranges will be available from next month
/Chicken/c\
**********************************************************\
We will not be stocking this item for next few weeks.\
**********************************************************
$d
#$d表示删除最后一行。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章