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表示删除最后一行。