sed是一个流编辑器,用于处理输入流中的文本信息,输入流可以是文件,也可以是管道中的输入。
sed的命令格式为:
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
OPTION有如下参数:
-n:静默模式,不打印缓冲区中的内容,只输出操作相关的行;
-e:添加要执行的指令,用于实现一行中同时执行多条操作;
-f:将操作写到脚本文件中,然后添加脚本文件去执行;
-i:将操作后的内容写入到文件中,不打印到屏幕上;
-r:在脚本中使用扩展正则表达式。
例1:
sed -n '$p' filename
显示filename文件中的最后一行信息,如果不加”-n“参数,则会显示文件所有行的信息,最后一行的信息会出现2次。
例2:
sed -e '1p' -e '3d' filename
通过”-e“参数在一行中依次执行多条操作,显示filename中的第1行内容,删除第3行内容。
例3:
sed -f b filename
通过”-f“参数指定一个脚本文件,脚本文件中的内容是操作指令,可以有多条,按行分隔,如脚本b中的内容为”$p“,则此sed操作就是显示filename的最后一行信息,注意脚本中的指令不能用”“或”。
例4:
sed -i '$a Hello World' filename
在filename文件的最后插入一行”Hello World“,这个操作会写入到filename文件中。相对的,上面的3个操作只会打印出信息,而不会写入到文件中去。
常用操作指令:
a:添加,要添加的内容放到a的后面,内容会被添加到指定行的下一行;
i:插入,要添加的内容放到i的后面,内容会被插入到指定行的上一行;
q:退出,完成指定的操作后退出;
c:取代,取代批定行的内容,可以是一行或多行;
d:删除,删除指定的行;
s/regexp/replacement/:替换,使用replacement中的内容替换regexp中的内容,可以使用正则表达式;
例1:
sed '1a Hello World' filename
sed '$a Hello World' filename
在filename第一行后添加”Hello World“信息;
在最后一行后添加”Hello World“信息。
例2:
sed '1i Hello World' filename
sed '$i Hello World' filename
在filename第一行前添加“Hello World”信息;
在最后一行前添加“Hello World”信息。
例3:
sed '2c Hello World' filename
sed '1,5c Hello World' filename
将filename的第2行内容换为“Hello World”;
将filename的第1行至第5行内容换为“Hello World”,第1行至第5行的5行内容会变为1行“Hello World”。
例4:
sed '2d' filename
sed '1,5d' filename
删除filename的第2行内容;
删除filename的第1行至第5行内容。
例5:
sed 's/ssh/Hello/g' filename
sed 's/^ssh/Hello/g' filename
替换filename中的所有ssh为Hello;
替换filename中的行首ssh为Hello。
前者是等量替换,即写入的是什么就替换什么;后者是正则表达式替换,只有满足正则表达式条件的才会被替换。
参数“g”的作用是对一行中的所有元素进行替换,如果不加参数“g”,那每行中只有第1个相同的元素会被替换,其它的元素会被跳过。
例6:
sed -i '/bash$/d' filename
删除filename中结尾为bash的行,操作会写入到文件中。
例7:
sed -i '/^po/a football' filename
在开头是po的行后面添加“football”,操作会写入到文件中。
例8:
sed '5q' filename
打印filename文件的前5行后退出。
正则表达式元字符集:
^:行首;
$:行尾;
.:匹配一个任意字符,不能是换行符;
*:匹配0个或多个字符;
[]:匹配一个指定范围内的字符;
[^]:匹配一个不在指定范围内的字符;
&:保存搜索的字符,例如’s/port/&/g’,会将port替换为port;
\<:单词的起始位,例如'/\<s/'表示以s开头的单词;
\>:单词的结束位,例如'/s\>/'表示以s结尾的单词;
x{m}:重复字符x共m次;
x{m,}:重复字符x最少m次;
x{m,n}:重复字符x最少m次,最多n次;