和awk一样,本章主要通过实例对sed进行介绍。这样,更利于我们进行理解;所以,阅读本章时,请以“应用实例”为中心进行阅读,其它部分是参考内容。
sed介绍
sed是一个非交互性文本流编辑器。和awk一样,它是个独立的工具,当然也可以和bash联合使用。
它 可以随意编辑文件或标准输入,对它们进行编辑、删除。它能一次性处理所有改变,对用户来讲,十分高效。sed编辑文件或标准输入时,编辑的是它们的拷贝; 也就是说,不会改变原始的文件。若需要保存修改,可以通过重定向操作符>>、>>>,或者在利用sed的写入参数。
sed使用参数
[root@www ~]# sed [-nefr] [动作]
选项与参数:
-n :使用安静(silent)模式。在一般sed的用法中,所有来自STDIN的数据一般都会被列出到终端上。但如果加上-n参数后,
则只有经过sed特殊处理的那一行(或者动作)才会被列出来。
-e :直接在命令行模式上进行sed的动作编辑;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-r :sed 的动作支持的是扩展型正则表达式的语法。(默认是基础正则表达式语法)
-i :直接修改读取的文件内容,而不是输出到终端。
动作说明: [n1[,n2]]function
n1, n2 :不见得会存在,一般代表选择进行动作的行数,举例来说,如果我的动作是需要在10 到 20行之间进行的,则" 10,20[动作行为]"
function有下面这些参数:
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :替换, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何参数;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :替换,可以直接进行替换的工作哩!通常这个 s 的动作可以搭配正则表达式!例如 1,20s/old/new/g 就是啦!
应用实例
首先建立一个123.txt,添加任意文本,然后进行以下练习。
(01), 输出文件第5行
$ sed -n '5p' 123.txt
说明:
-n表示默认不输出任何内容。5p表示输出第5行:5表示第5行,p表示输出。
(02), 输出文件除1-3行之外的行
$ sed -n '1,3!p' 123.txt
说明:
"1,3"表示输出范围是第1-3行; "1,3!"表示输出范围是除第1-3行之外。
'1,$p'表示输出全部行,因为$表示最后一行。
(03), 输出"ls -l"结果中的第1-3行
$ ls -l |sed -n '1,3p'
说明:
|是管道符号,表示将ls -l的输出作为sed的输入。
(04), 输出匹配“the”的行
$ sed -n '/the/p' 123.txt
说明:
/the/表示匹配the的行
(05), 输出匹配“the”的行,并且输出每行行号
$ sed -n -e '/the/p' -e '/the/=' 123.txt
说明:
-e表示对每行进行多重编辑,多重编辑的每一个命令前都需要添加-e。
本例中,-e '/the/p'打印匹配the的行;-e '/the/='表示输出匹配the的行的行号。
(06), 删除匹配“the”的行
$ sed '/the/d' 123.txt
说明:
d表示删除。
(07), 删除匹配“the”的行;然后输出删除操作之后的所有行,并输出每行行号
$ sed '/the/d' 123.txt | sed -n -e '1,$p' -e '1,$='
说明:
sed '/the/d' 123.txt :得到了删除“the”之后的行
| :管道符号。意味着前面的输出作为后面的输入
sed -n -e '1,$p' -e '1,$=' :表示输出全部行之后,在输出每行行号
(08), 在每一行前面插入2行文本,第一行是line1,第2行是line2
$ sed '1,$iline1\nline2' 123.txt
说明:
1,$i表示第一行到最后一行的每一行都执行插入操作。
line1\nline2表示插入的文本,其中\n转义之后表示“换行”符号。
(09), 在最后一行后面插入1行文本,内容是end
$ sed '$aend' 123.txt
说明:
$表示最后一行,a表示在文本后插入,end是插入的内容
(10), 将“this”全部替换成“that”
$ sed 's/this/that/g' 123.txt
说明:
[ address[,address ] ] s / pattern-to-find / replacement-pattern/[gpwn]
s 表示替换操作。查询pattern-to-find,成功后用replacement-pattern替换它。
替换选项如下:
g 缺省情况下只替换每行的第一次匹配,g表示替换每行的所有匹配。
p 缺省sed将所有被替换行写入标准输出,加p选项将使-n选项无效。-n选项不打印输出结果。
w 后接“文件名”,表示将输出定向到一个文件。
(11), 将“this”全部替换成“this boy”
$ sed 's/this/this boy/g' 123.txt 或 $ sed 's/this/boy &/g' 123.txt
说明:
sed 's/this/boy &/pg' 123.txt中&表示附加修改(即在原始内容的基础上添加内容)。
&表示匹配的内容。即,boy &等价于boy this
(12), 去掉空白行后另存文件
$ sed '/^$/d' 123.txt > 456.txt 或 $ sed '/^$/c\' 123.txt > 456.txt
说明:
/^$/表示空白行:^表示开启,$表示结尾,开始和结尾之间没有任何内容,即是空白行。
c\表示修改。
(13), 去掉文件扩展名
$ echo "hello.txt"| sed 's/.txt//g'
(14), 添加文件扩展名
$ echo "hello"| sed 's/$/.txt/g'
(15), 删除文本中每一行的第2个字符
$ sed 's/.//2' ori.txt > dst.txt
(16), 删除文本中每一行的倒数第2个字符
$ sed 's/\(.\)\(.\)$/\2/' ori.txt > dst.txt
#说明:考察了sed中"\( \)"的含义和用法
(17), 删除每一行的第2个单词
$ sed 's/\([[:alpha:]]\+\)\(\ \)\([[:alpha:]]\+\)*/\1/' ori.txt > dst.txt
(18), 隔行删除
$ sed '0~2 d' ori.txt > dst.txt