Sed命令
需要注意的地方:
一、输出重定向到其他文件;
二、在用sed命令操作的时候并没有对源文件进行修改,可以把sed的输出结果重定向到其他文件来保存最新内容;
sed命令格式:
sed [options] '{command}' [filename]
下面是最常用的命令:
替换命令
单条替换命令。即对文件或行作一处修改。
格式为:
sed [option] 's/old_value/new_value/' [filename]
把old_value这个字符或字符串替换为新的字符或字符串。
举例如下:
[root@localhost test]# echo "I can do it" | sed 's/I/You/'
You can do it
这里使用了管道,所以没有使用filename。
多条替换命令。即对文件或行作多处修改。
方法一:
利用-e选项。格式为:
sed [options] -e 's/old_value/new_value/' -e 's/old_value/new_value/'... filename
举例如下:
[root@localhost test]# echo "I can do it" | sed -e 's/I/You/' -e 's/it/them/'
You can do them
方法二:
利用分号。格式为:
sed [options] 's/old_value/new_value/;s/old_value/new_value/;...' [filename]
注意:
斜线与分号之间没有空格。
举例如下:
[root@localhost test]# echo "I can do it" | sed 's/I/You/;s/it/them/'
You can do them
但是我在斜线与分号之间有个空格,输出一样:
[root@localhost test]# echo "I can do it" | sed 's/I/You/; s/it/them/'
You can do them
留待考究。
方法三:
前提必须知道的是sed的command部分,sed靠识别完整的单引号来判断命令是否完成输入,所以直到第二个单引号
出现之前sed的输入不会结束。所以可以如下完成:
sed [options] '<Enter>
>s/old_value/new_value/
>s/old_value/new_value/
...
>s/old_value/new_value/' [filename]
举例如下:
[root@localhost test]# echo "I can do it" | sed '
> s/I/You/
> s/it/them/'
You can do them
多条替换命令之全局修改:
先看这个例子:
[root@localhost test]# cat sh_test2
two 1
two 1 two 1
two 1 two 1 two 1
[root@localhost test]# sed 's/two/three/' sh_test2
three 1
three 1 two 1
three 1 two 1 two 1
如上面所述,只是修改了每行的第一个匹配的字符串,如果修改全部即全局修改的话要在斜线后面加个g,如:
[root@localhost test]# sed 's/two/three/g' sh_test2
three 1
three 1 three 1
three 1 three 1 three 1
g(global)表示全局的意思。
有限制的替换命令
指满足一定条件的才进行替换修改。
先准本一个文档作为例子:
[root@localhost test]# cat sh_test
I can do it!
You can do it!
We can do it!
把"can"修改为"should",加个限制条件是,替换当且仅当出现在"I"后面的"can",命令为:
[root@localhost test]# sed '/I/ s/can/should/' sh_test
I should do it!
You can do it!
We can do it!
改进版:
[root@localhost test]# sed '
> /I/ s/can/could/
> /You/ s/can/should/
> /We/ s/can/must/' sh_test
I could do it!
You should do it!
We must do it!
开始的时候提到过,源文件并没有修改,如果要保存sed命令的结果的话需要重定向到其他文件,如:
[root@localhost test]# sed '
> /I/ s/can/could/
> /You/ s/can/should/
> /We/ s/can/must/' sh_test > sh_test1
[root@localhost test]# cat sh_test1
I could do it!
You should do it!
We must do it!
限制行
即是说,sed命令限制在某行当中进行编辑。例如:
[root@localhost test]# cat sh_test
I can do it!
You can do it!
We can do it!
[root@localhost test]# sed '1,2 s/can/could/' sh_test
I could do it!
You could do it!
We can do it!
上面的例子限制在第1和2行进行修改。同理,sed '1 s/can/could/' sh_test将只修改第1行的can。
禁止显示
由上面的例子都可以看到,每次输出都会有修改后的结果显示,即使是重定向到其他文件,在这里可以禁止显示这些结
果。只需在options中加入-n即可。例如:
[root@localhost test]# sed -n '1,2 s/can/could/' sh_test
[root@localhost test]#
但是要注意一点的是,-n会被一条显示命令 -p覆盖。例如,先修改test_1:
[root@localhost test]# cat test_1
/I/ s/can/should/p
/You/ s/can/could/
/We/ s/can/must/p
其中,第2行没有添加p,按前面所说的话,第2行将不能显示出来,1,3行能显示,如下:
[root@localhost test]# sed -n -f test_1 sh_test
I should do it!
We must do it!
可以这样做,再修改test_1,修改结果如下:
[root@localhost test]# cat test_1
/I/ s/can/should/p
/You/ s/can/could/p
然后再运行一次:
[root@localhost test]# sed -n -f test_1 sh_test
I should do it!
You could do it!
这样做的目的是什么呢?可以发现在test_1中要修改的地方都加了-p,所以跟-n搭配起来可以输出修改的内容,没
有被修改的内容没有显示出来,所以在上面还可以这样:
sed -n -f test_1 sh_test > sh_test_out
把被修改的内容重定向的其他文件中保存。
删除命令
删除的时候是删除整行,但是如果想删除一个单词的话可以应该用空的内容来替换,而非删除整行。
格式为:sed '{what to find} d' [filename]
如:
[root@localhost test]# cat sh_test1
I could do it!
You should do it!
We must do it!
[root@localhost test]# sed '/You/ d' sh_test
I can do it!
We can do it!
删除含有"You"字符串的行。
[root@localhost test]# sed '1,2 d' sh_test
We can do it!
删除第1行到第2行。
其余还应注意这几条:
删除空白行:sed '/^$/ d' {filename}
删除以two开头的行:sed '/^two/ d' sh_test
删除以two结尾的行:sed '/two$/ d' sh_test
其通常的用途是删除一个标题。以下命令将删除文件中所有的行,从第一行直到第一个空行:
sed '1,/^$/ d' {filename}
删除的另一种格式为:sed '{what to find} !d' [filename]
表示出了满足{what to find}的内容之外的行都删除,如:
[root@localhost test]# sed '/You/ !d' sh_test
You can do it!
添加和插入文本
注意添加和插入的区别,先举例如下:
添加:
[root@localhost test]# sed '2a Add the string' sh_test
I can do it!
You can do it!
Add the string
We can do it!
插入:
[root@localhost test]# sed '2i Insert the string' sh_test
I can do it!
Insert the string
You can do it!
We can do it!
可以看出,在第2行添加和在第2行插入是不同的。
除此之外,可以在文件开头和末尾添加,命令分别为:
sed '^a {what}' [filename]
和
sed '$a {what}' [filename]
使用脚本文件
把[command]部分存为脚本,命令sed通过-f来调用。因此可以通过调用脚本文件来减少输入程序。
格式为:
sed -f [sed_script_name] [filename]
其中sed_script_name为脚本文件名。
例如:
[root@localhost test]# cat test_1
/I/ s/can/should/
/You/ s/can/could/
/We/ s/can/must/
[root@localhost test]# cat sh_test
I can do it!
You can do it!
We can do it!
[root@localhost test]# sed -f test_1 sh_test
I should do it!
You could do it!
We must do it!
读写文本
在这里是指除重定向到其他文件的方法。从文件1中找出符合条件的内容添加到新建的文件2中。
比如:
[root@localhost test]# sed -n '1,3 w sh_test3' sh_test
[root@localhost test]# cat sh_test3
I can do it!
You can do it!
We can do it!
修改内容命令
在这里注意修改内容的方式与删除的方式差不多,作用的对象都是整行。例如:
[root@localhost test]# sed '/You/ c The string in this line was changed!' sh_test
I can do it!
The string in this line was changed!
We can do it!
如此可知,它与替换是完全不同的。
提前结束命令的运行
即是说当满足条件的时候就不往下执行。sed默认读取整个文件,即达到末尾的时候才停止。
例如,执行完前2行之后退出:
[root@localhost test]# sed '
> /I/ s/can/could/
> /You/ s/can/should/
> /We/ s/can/must/
> 2q' sh_test
I could do it!
You should do it!
sed利用这一点可以指定读取的行数,如只读取前两行:
[root@localhost test]# sed 2q sh_test
I can do it!
You can do it!