Sed基本入门[4] Additional Sed Commands
1、行后追加命令 a (Append Line After)
可以在指定的行后追加一行或多行文本,其基本语法为:
$ sed '[address] a the-line-to-append' input-file
示例,在最后一行后添加一行文本:
$ sed '$ a 106,Jack Johnson,Engineer' employee.txt 101,John Doe,CEO 102,Jason Smith,IT Manager 103,Raj Reddy,Sysadmin 104,Anand Ram,Developer 105,Jane Miller,Sales Manager 106,Jack Johnson,Engineer
在含有"Manager"的行后新添两行文本:
$ sed '/Jason/a \ I am Jason\ My name is Jason' employee.txt
显示结果为:
101,John Doe,CEO 102,Jason Smith,IT Manager I am Jason My name is Jason 103,Raj Reddy,Sysadmin 104,Anand Ram,Developer 105,Jane Miller,Sales Manager
2、在行前插入一行 i (Insert Line Before)
和命令 a 类似,区别只是在行前插入一行,基本语法为:
$ sed '[address] i the-line-to-insert' input-file
一个示例,在奇数行前插入一行文本:
$ sed '1~2 i before odd ' employee.txt before odd 101,John Doe,CEO 102,Jason Smith,IT Manager before odd 103,Raj Reddy,Sysadmin 104,Anand Ram,Developer before odd 105,Jane Miller,Sales Manager
3、更改某行 c (Change Line)
把某行的内容用新文本行(可以一行或多行)替换,基本语法:
$ sed '[address] c the-line-to-insert' input-file
示例,把第二行文本替换为新文本行内容:
$ sed '2 c 202,Jack Johnson,Engineer' employee.txt 101,John Doe,CEO 202,Jack Johnson,Engineer 103,Raj Reddy,Sysadmin 104,Anand Ram,Developer 105,Jane Miller,Sales Manager
4、结合使用 a,i,和 c 命令
我们可以结合使用这3个命令,看一个示例,在包含文本“Jason”的行后插入一行文本,之前插入一行文本,并修改此行文本
$ sed '/Jason/{ > a\ > 204,Jack Johnson,Engineer > i\ > 202,Mark Smith,Sales Engineer > c\ > 203,Joe Mason,Sysadmin > }' employee.txt
101,John Doe,CEO 202,Mark Smith,Sales Engineer 203,Joe Mason,Sysadmin 204,Jack Johnson,Engineer 103,Raj Reddy,Sysadmin 104,Anand Ram,Developer 105,Jane Miller,Sales Manager
5、打印隐藏字符 l (Print Hidden Characters)
命令 l 可以打印文本中的隐藏字符,例如 \t(tab)、$(行尾)
示例,
$ sed -n l employee.txt 101,John Doe,CEO $ 102,Jason Smith,IT Manager$ 103,Raj Reddy,Sysadmin$ 104,Anand Ram,Developer$ 105,Jane\tMiller,Sales Manager$
还可以在命令 l 后加上一个数字n,表示从第n个字符进行折行显示,例如:
$ sed -n 'l 20' employee.txt 101,John Doe,CEO $ 102,Jason Smith,IT \ Manager$ 103,Raj Reddy,Sysad\ min$ 104,Anand Ram,Devel\ oper$ 105,Jane\tMiller,Sa\ les Manager$
6、打印行号 = (Print Line Numbers)
n可以在执行流中的默认打印前输出改行的行号,例如:
$ sed = employee.txt 1 101,John Doe,CEO 2 102,Jason Smith,IT Manager 3 103,Raj Reddy,Sysadmin 4 104,Anand Ram,Developer 5 105,Jane Miller,Sales Manager
还可以指定哪些行打印行号:
$ sed ‘2,4=’ employee.txt 101,John Doe,CEO 2 102,Jason Smith,IT Manager 3 103,Raj Reddy,Sysadmin 4 104,Anand Ram,Developer 105,Jane Miller,Sales Manager
我们可以使用如下的方式来获得一个文件的行数(等同于 wc -l 的效果):
$ sed -n '$ =' employee.txt 5
7、字符集替换 y (transform)
可以使用命令 y 进行字符集的替换,基本语法为:
sed 'y/{set1}/{set2}/' employee.txt
其中的set1和set2分表表示一个字符的集合,而且集合元素长度必须相等
示例,将小写的字母a、b、c、d、e分别替换为对应的大写字母A、B、C、D、E
$ sed 'y/abcde/ABCDE/' employee.txt 101,John DoE,CEO 102,JAson Smith,IT MAnAgEr 103,RAj REDDy,SysADmin 104,AnAnD RAm,DEvElopEr 105,JAnE MillEr,SAlEs MAnAgEr
8、同时处理多个文件
我们以上的处理中,都是一一个文件作为处理的文件,其实可以同时处理多个文件,只要在命令后的末位罗列文件名即可,例如以下示例,同时打印出两个文件中包含 "root" 的文本行:
$ sed -n '/root/ p' /etc/passwd /etc/group root:x:0:0:root:/root:/bin/bash root:x:0:
9、退出执行 q (Quit Sed)
我们刚开始讲到过,sed的执行流程是:读取一行,执行命令,打印输出,重复以上步骤。
如果在“执行命令”中碰到了q命令,则会停止执行命令中接下来未执行的命令,转而打印输出,但是不再“重复以上步骤”,而是直接退出。
示例,在打印第一行后退出:
$ sed 'q' employee.txt 101,John Doe,CEO
如果找到了含有"Manager"的行后,退出执行:
$ sed '/Manager/q' employee.txt 101,John Doe,CEO 102,Jason Smith,IT Manager
10、从文件中读取 r (Read from File)
命令r表示从一个文件中读取内容然后打印在某个位置之后
$ sed -e '2 r path.txt' employee.txt 101,John Doe,CEO 102,Jason Smith,IT Manager reading /usr/local/bin directory 103,Raj Reddy,Sysadmin 104,Anand Ram,Developer 105,Jane Miller,Sales Manager
11、打印当前行并读取下一行 n (Print Pattern Space)
命令 n 会将当前模式空间中的内容打印,然后从文件中读取下一行放到模式空间中以取代当前模式空间中的内容,这个过程发生在sed流程中的 “执行命令”阶段,因此会影响通常的执行流程。
加上在命令 n 前后各有两个命令,例如:
sed-command-1 sed-command-2 n sed-command-3 sed-command-4
则命令 n 前两个命令在当前的模式空间中的文本行上执行,而命令 n 后的两条命令则在下一行的文本行上执行。