sed范例
cat test_sed.txt
abc def hic lmn abc
123 456 1.23 4.5 321
ABC Def hIc lmN ABC
ABC Def hIc lmN dsf
A BC Def hIc lmN ABC
You are a good boy
you are not a good girl
That's a very lovely dog
例1. 打印:p命令
sed '/abc/p' test_sed.txt
输出:
abc def hic lmn abc
abc def hic lmn abc
123 456 1.23 4.5 321
ABC Def hIc lmN ABC
ABC Def hIc lmN dsf
A BC Def hIc lmN ABC
You are a good boy
you are not a good girl
That's a very lovely dog
说明:p命令用于打印操作。默认情况下sed将所有输入行都打印在屏幕上,如果在某一行匹配到模式,sed将把该行另外再打印一遍。
sed -n '/abc/p' test_sed.txt
输出:
abc def hic lmn abc
说明:默认情况下sed打印当前模式缓冲区的输入行,命令p指示sed再次打印该行。选项-n用于取消sed的默认打印动作。选项-n和p配合使用时,模式缓冲区内的内容只打印一次。
例2. 删除:d命令
命令d用于删除输入行。sed先将输入行从文件复制到模式缓冲区,然后对该行执行sed命令,最后将模式缓冲区的内容输出到屏幕上。如果发出的是d命令。当前模式缓冲区里的输入行将被删除,不被显示。
sed '3d' test_sed.txt
输出:
abc def hic lmn abc
123 456 1.23 4.5 321
ABC Def hIc lmN dsf
A BC Def hIc lmN ABC
You are a good boy
you are not a good girl
That's a very lovely dog
说明:删除第三行,默认情况下,其余行都被打印在屏幕上。
sed '3,$d' test_sed.txt
输出:
abc def hic lmn abc
123 456 1.23 4.5 321
说明:删除从第三行到最后一行的内容,剩余行将被打印。美元符号($)代表文件的最后一行,逗号被称为范围操作符。
sed '/^[Aa]/d' test_sed.txt
输出:
123 456 1.23 4.5 321
You are a good boy
you are not a good girl
That's a very lovely dog
说明:删除以A或a开头的行,剩余行将被打印。
sed '/^A/, /^y/d' test_sed.txt
输出:
abc def hic lmn abc
123 456 1.23 4.5 321
That's a very lovely dog
说明:删除从以A开头的行开始到以y开头的行之间的所有行,打印剩余行。
例3.替换: s命令
命令s是替换命令。s后包含在文本中的内容是正则表达式,后面跟着的是需要替换的文本。可以通过g标志对行进行全局替换。注意下面第三行的A BC中A和B之间有个空格
sed -n 's/ABC/BCA/p' test_sed.txt
输出:
BCA Def hIc lmN ABC
BCA Def hIc lmN dsf
A BC Def hIc lmN BCA
sed -n 's/ABC/BCA/gp' test_sed.txt
输出:
BCA Def hIc lmN BCA
BCA Def hIc lmN dsf
A BC Def hIc lmN BCA
说明:命令标志g表示在行内进行全局替换。也就是说某一行出现多个ABC都将被替换,如果没有g标志,则只将每行的第一个ABC替换。
sed -n 's/ABC$/BCA/gp' test_sed.txt
输出:
ABC Def hIc lmN BCA
A BC Def hIc lmN BCA
说明:替换只在行尾的ABC,虽然此处用了g标志,但是也不会替换处于行首的ABC
sed -n 's/^[0-9]{1,3}/&.00/p' test_sed.txt
输出:
123.00 456 1.23 4.5 321
说明:当'&'符号用在替换串中时,它代表在查找串中匹配到得内容。上面的例子是在以3个数字开头的那三个数字后面添加".00",这个例子中的“&”代表“123”。
sed -n "s/That\('s\)/This\1/p" test_sed.txt
输出:
This's a very lovely dog
说明:包含在圆括号里的“ 's ”作为标签1保存在特定的寄存器中,替换串可以通过“ \1 ” 引用它。这里将"that"替换为了"this"
注:当模式中使用了单引号模式的最外边最好用双引号,反之亦然。
sed -n "s#That\('s\)#This\1#p" test_sed.txt
输出:
This's a very lovely dog
说明:紧跟在s命令后的字符就是查找串和替换串之间的分隔符。分隔符默认是正斜杠(/),但可以改变。无论什么字符(换行符和反斜杠除外),只要是紧跟在s命令之后,就成了新的串的分隔符。这个在查找包含正斜杠的模式时很有用。例如查找路径或生日等。
sed -n "4,6s/Def/def/p" test_sed.txt
输出:
ABC def hIc lmN ABC
ABC def hIc lmN dsf
A BC def hIc lmN ABC
说明:将4至6行的Def替换为def,s前面用两个数字中间加一个逗号来界定要替换的范围。
sed "10s/^$/hello world/" test_sed.txt | cat -n
输出:
1 abc def hic lmn abc
2 abc def hic lmn abc
3 123 456 1.23 4.5 321
4 ABC Def hIc lmN ABC
5 ABC Def hIc lmN dsf
6 A BC Def hIc lmN ABC
7 You are a good boy
8 you are not a good girl
9 That's a very lovely dog
10 hello world
说明:替换第10行的空行为hello world(相当于添加了一行),这种添加的好处是,可以用正则表达式,可以添加换行符(\n),制表符(\t)等。如(sed "10s/^$/\thello world\n/" test_sed.txt)下面的例4,例5也可以做添加和替换指定行,但是不能用正则和换行符等。
例4.指定行号替换:c
sed '4chello world' test_sed.txt | cat -n
输出:
1 abc def hic lmn abc
2 123 456 1.23 4.5 321
3 ABC Def hIc lmN ABC
4 hello world
5 A BC Def hIc lmN ABC
6 You are a good boy
7 you are not a good girl
8 That's a very lovely dog
例5.添加:a i
sed '4ahello world' test_sed.txt | cat -n
输出:
1 abc def hic lmn abc
2 123 456 1.23 4.5 321
3 ABC Def hIc lmN ABC
4 ABC Def hIc lmN dsf
5 hello world
6 A BC Def hIc lmN ABC
7 You are a good boy
8 you are not a good girl
9 That's a very lovely dog
说明:<行号>a<字符串> 在指定的<行号>后面添加指定的字符串,<行号>i<字符串>在指定的<行号>前面添加指定的字符串。
例6.指定行的范围:逗号
行的范围从文件中一个地址开始,在另一个地址结束。地址范围可以是行号(例如5,10)正则表达式(例如/ABC/,/You/)或两者的结合(例如:/ABC/,$)范围是闭合的包含开始条件的行,结束条件的行。如果结束条件无法满足就会一直操作到文件尾。如果结束条件满足,则继续查找满足开始条件的位置,范围重新开始。
cat test_sed2.txt
abc def hic lmn abc
123 456 1.23 4.5 321
ABC Def hIc lmN ABC
you are not a girl
ABC Def hIc lmN dsf
A BC Def hIc lmN ABC
abc cde acd lll des
You are a good boy
you are not a good girl
That's a very lovely dog
sed -n '/abc/,/you/p' test_sed2.txt
输出:
abc def hic lmn abc
123 456 1.23 4.5 321
ABC Def hIc lmN ABC
you are not a girl
abc cde acd lll des
You are a good boy
you are not a good girl
说明:打印包含模式abc的行到包含模式you的行之间的行,如果abc出现在you之后的某一行,则打印的范围从abc所在行开始,到下一个出现you的行或文件尾(如果没有再出现包含模式you的行)
sed -n '2,/you/p' test_sed2.txt
输出:
123 456 1.23 4.5 321
ABC Def hIc lmN ABC
you are not a girl
说明:打印从2行开始到第一个以you结尾的行之间所有的行。
例7.多重编辑:e命令
-e命令是编辑命令,用于sed执行多个编辑任务的情况。在下一行开始编辑前所有的编辑动作将应用到模式缓冲区的行上。
sed -e '5,$d' -e 's/ABC/BCA/g' test_sed2.txt
输出:
abc def hic lmn abc
123 456 1.23 4.5 321
BCA Def hIc lmN BCA
you are not a girl
说明:-e命令用于多重编辑,第一重删除第5行到最后一行之间的所有行,第二重替换包含模式ABC的行的所有ABC为BCA,因为是逐行进行这两行编辑(即这两个命令都在模式空间的当前行执行),所以编辑命令的顺序会影响结果。例如,如果两个命令都是替换命令则前一次替换会影响后一次替换。
例8.将修改作用于文件:-i
sed -i '3,$d' test_sed2.txt cat test_sed2.txt
输出:
abc def hic lmn abc
123 456 1.23 4.5 321
在文件末尾追加内容
sed -i '$a\hello world' test_sed2.txt
输出:
abc def hic lmn abc
123 456 1.23 4.5 321
hello world