windows ubuntu:sed,awk,grep篇:5.sed 附加命令

28.追加命令(命令 a)

使用命令 a 可以在指定位置的后面插入新行。
语法:
$ sed ‘[address] a the-line-to-append’ input-file
在第 2 行后面追加一行(原文这里可能有问题,没有写明行号):
$ sed '2 a 203,Jack Johnson,Engineer' employee.txt
101,Johnny Doe,CEO
102,Jason Smith,IT Manager
203,Jack Johnson,Engineer
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
employee.txt 文件结尾追加一行:
$ sed '$ a 106,Jack Johnson,Engineer' employee.txt
101,Johnny Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
106,Jack Johnson,Engineer
sed 也可以追加多行。
在匹配 Jason 的行的后面追加两行:
$ sed '/Jason/a\
> 203,Jack Johnson,Engineer\
> 204,Mark Smith,Sales Engineer' employee.txt
101,Johnny Doe,CEO
102,Jason Smith,IT Manager
203,Jack Johnson,Engineer
204,Mark Smith,Sales Engineer
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
追加多行之间可以用 \n 来换行,这样就不用折行了 , 上面的命令等价于 :
sed '/Jason/a 203,Jack Johnson,Engineer\n204,Mark Smith,Sales Engineer' employee.txt

29.插入命令(命令 i)

插入命令 insert 命令和追加命令类似,只不过是在指定位置之前插入行。
语法:
$ sed ‘[address] i the-line-to-insert’ input-file
employee.txt 的第 2 行之前插入一行 :
$ sed '2 i 203,Jack Johnson,Engineer' employee.txt
101,Johnny Doe,CEO
203,Jack Johnson,Engineer
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
employee.txt 最后一行之前,插入一行 :
$ sed '$ i 108,Jack Johnson,Engineer' employee.txt
101,Johnny Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
108,Jack Johnson,Engineer
105,Jane Miller,Sales Manager
sed 也可以插入多行。
在匹配 Jason 的行的前面插入两行 :
$ sed '/Jason/i\
> 203,Jack Johnson,Engineer\
> 204,Mark Smith,Sales Engineer' employee.txt
101,Johnny Doe,CEO
203,Jack Johnson,Engineer
204,Mark Smith,Sales Engineer
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager

30.修改命令(命令 c)

修改命令 change 可以用新行取代旧行。
语法:
$ sed ‘[address] c the-line-to-insert’ input-file
用新数据取代第 2 :
$ sed '2 c 202,Jack,Johnson,Engineer' employee.txt
101,Johnny Doe,CEO
202,Jack,Johnson,Engineer
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
这里命令 c 等价于替换: $ sed '2s/.*/202,Jack,Johnson,Engineer/' employee.txt
sed 也可以用多行来取代一行。
用两行新数据取代匹配 Raj 的行:
$ sed '/Raj/c\
> 203,Jack Johnson,Engineer\
> 204,Mark Smith,Sales Engineer' employee.txt
101,Johnny Doe,CEO
102,Jason Smith,IT Manager
203,Jack Johnson,Engineer
204,Mark Smith,Sales Engineer
104,Anand Ram,Developer
105,Jane Miller,Sales Manager

31.命令 ai c 组合使用

命令 ai c 可以组合使用。下面的例子将完成三个操作:
z a ”Jason”后面追加”Jack Johnson”
z i ”Jason”前面插入”Mark Smith”
z c ”Joe Mason”替代”Jason”
$ sed '/Jason/ {
> a\
> 204,Jack Johnson,Engineer
> i\
> 202,Mark Smith,Sales Engineer
> c\
> 203,Joe Mason,Sysadmin> }' employee.txt
101,Johnny 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

32.打印不可见字符(命令 l)

命令 l 可以打印不可见的字符,比如制表符\t,行尾标志$等。
请先建立下面文件以便用于后续测试,请确保字段之间使用制表符(Tab )分开:
$ cat tabfile.txt
fname First Name
lname Last Name
mname Middle Name
使用命令 l ,把制表符显示为 \t, 行尾标志显示为 EOL:
$ sed -n 'l' tabfile.txt
fname\tFirst Name$
lname\tLast Name$
mname\tMiddle Name$
如果在 l 后面指定了数字,那么会在第 n 个字符处使用一个不可见自动折行,效果如下 :
$ sed -n 'l 20' employee.txt
101,Johnny Doe,CEO$
102,Jason Smith,IT \
Manager$
103,Raj Reddy,Sysad\
min$
104,Anand Ram,Devel\
oper$
105,Jane Miller,Sal\
es Manager$
这个功能只有 GNU sed 才有。

33.打印行号(命令=)

命令 = 会在每一行后面显示该行的行号。 打印所有行号 :
$ sed '=' employee.txt
1
101,Johnny Doe,CEO
2
102,Jason Smith,IT Manager
3
103,Raj Reddy,Sysadmin
4
104,Anand Ram,Developer
5
105,Jane Miller,Sales Manager
提示: 把命令 = 和命令 N 配合使用,可以把行号和内容显示在同一行上 ( 下文解释 )
只打印 1,2,3 行的行号 :
$ sed '1,3 =' employee.txt
1
101,Johnny Doe,CEO
2
102,Jason Smith,IT Manager
3
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
打印包含关键字 ”Jane” 的行的行号,同时打印输入文件中的内容:
$ sed '/Jane/ =' employee.txt
101,Johnny Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
5
105,Jane Miller,Sales Manager
如果你想只显示行号但不显示行的内容,那么使用 -n 选项来配合命令 =:
$ sed -n '/Raj/ =' employee.txt
3
打印文件的总行数:
$ sed -n '$ =' employee.txt
5

34.转换字符(命令 y)

命令 y 根据对应位置转换字符。好处之一便是把大写字符转换为小写,反之亦然。
下面例子中,将把 a 换为 Ab 换为 Bc 换为 C,以此类推:
$ sed 'y/abcde/ABCDE/' employee.txt
101,Johnny DoE,CEO
102,JAson Smith,IT MAnAgEr
103,RAj REDDy,SysADmin
104,AnAnD RAm,DEvElopEr
105,JAnE MillEr,SAlEs MAnAgEr
把所有小写字符转换为大写字符:
$ sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' employee.txt
101,JOHNNY DOE,CEO
102,JASON SMITH,IT MANAGER
103,RAJ REDDY,SYSADMIN
104,ANAND RAM,DEVELOPER
105,JANE MILLER,SALES MANAGER

35.操作多个文件

之前的例子都只操作了单个文件,sed 也可以同时处理多个文件。
/etc/passwd 中搜索 root 并打印出来:
$ sed -n '/root/ p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
/etc/group 中搜索 root 并打印出来:
$ sed -n '/root/ p' /etc/group
root:x:0:
同时在 /etc/passwd /etc/group 中搜索 root:
$ sed -n '/root/ p' /etc/passwd /etc/group
root:x:0:0:root:/root:/bin/bash
root:x:0:

36.退出 sed(命令 q)

命令 q 终止正在执行的命令并退出 sed
之前提到,正常的 sed 执行流程是:读取数据、执行命令、打印结果、重复循环。
sed 遇到 q 命令,便立刻退出,当前循环中的后续命令不会被执行,也不会继续循环。
打印第 1 行后退出 :
$ sed 'q' employee.txt
101,Johnny Doe,CEO
打印第 5 行后退出,即只打印前 5 行:
$ sed '5 q' employee.txt
101,Johnny Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
打印所有行,直到遇到包含关键字 Manager 的行 :
$ sed '/Manager/ q' employee.txt
101,Johnny Doe,CEO
102,Jason Smith,IT Manager
注意: q 命令不能指定地址范围 ( 或模式范围 ), 只能用于单个地址 ( 或单个模式 )

37.从文件读取数据(命令 r)

在处理输入文件是,命令 r 会从另外一个文件读取内容,并在指定的位置打印出来。下面的
例子将读取 log.txt 的内容,并在打印 employee.txt 最后一行之后,把读取的内容打印出来。
事实上它把 employee.txt log.txt 合并然后打印出来。
$ sed ‘$ r log.txt’ employee.txt
也可以给命令 r 指定一个模式。下面的例子将读取 log.txt 的内容,并且在匹配 ’Raj’ 的行后面
打印出来:
$ sed ‘/Raj/ r log.txt’ employee.txt

38.sed 模拟 Unix 命令(cat,grep,read)

之前的例子的完成的功能都很像标准的 Unix 命令。使用 sed 可以模拟很多 Unix 命令。完成
它们,以便更好地理解 sed 的工作过程。
模拟 cat 命令
cat employee.txt
下面的每个 sed 命令的输出都和上面的 cat 命令的输出一样:
sed ‘s/JUNK/&/p’ employee.txt
sed –n ‘p’ employee.txt
sed ‘n’ employee.txt
sed ‘N’ employee.txt
模拟 grep 命令
grep Jane employee.txt
下面的每个 sed 命令的输出都和上面的 grep 命令的输出一样:
sed –n ‘s/Jane/&/ p’ employee.txt
sed –n ‘/Janme/ p’ employee.txt
grep –v (打印不匹配的行):
sed –n ‘/Jane/ !p’ employee.txt
注意: 这里不能使用 sed –n ‘s/Jane/&/ !p’ 了。
模拟 head 命令
head -10 /etc/passwd
下面的每个 sed 命令的输出都和上面的 head 命令的输出一样:
sed ’11,$ d’ /etc/passwd
sed –n ‘1,10 p’ /etc/passwd
sed ’10 q’ /etc/passwd

39.sed 命令选项

-n 选项
之前已经讨论过多次,并且在很多例子中也使用到了 -n 选项。该选项屏蔽 sed 的默认输出。
也可以使用—quiet,或者—silent 来代替-n,它们的作用是相同的。
下面所有命令都是等价的 :
sed -n ‘p’ employee.txt
sed --quiet ‘p’ employee.txt
sed –silent ‘p’ employee.txt
-f 选项
可以把多个 sed 命令保存在 sed 脚本文件中,然后使用 -f 选项来调用,这点之前已经演示过 了。你也可以使用 —file 来代替-f
下面的命令是等价的 :
sed –n –f test-script.sed /etc/passwd
sed –n –file=test-script.sed /etc/passwd
-e 选项
该选项执行来自命令行的一个 sed 命令,可以使用多个 -e 来执行多个命令。也可以使用
—expression 来代替。
下面所有命令都是等价的 :
sed –n –e ‘/root/ p’ /etc/passwd
sed –n –expression ‘/root/ p’ /etc/passwd
-i 选项
下面所有命令都是等价的 :
我们已经提到, sed 不会修改输入文件,只会把内容打印到标准输出 , 或则使用 w 命令把内
容写到不同的文件中。我们也展示了如何使用 -i 选项来直接修改输入文件。
在原始文件 employee.txt 中,用 Johnny 替换 John:
sed –i ‘s/John/Johnny/’ employee.txt
执行和上面相同的命令,但在修改前备份原始文件 :
sed –ibak ‘s/John/Johnny/’ employee.txt
也可以使用 --in-place 来代替 -i:
下面的命令是等价的 :
sed -ibak ‘s/John/Johnny/’ employee.txt
sed --in-place=bak ‘s/John/Johnny/’ employee.txt
-c 选项
该选项应和 -i 配合使用。使用 -i 时,通常在命令执行完成后, sed 使用临时文件来保持更改
后的内容,然后把该临时文件重命名为输入文件。但这样会改变文件的所有者 ( 奇怪的是我
的测试结果是它不会改变文件所有者 ) ,配合 c 选项,可以保持文件所有者不变。也可以使
--copy 来代替。
下面的命令是等价的 :
sed -ibak -c ‘s/John/Johnny/’ employee.txt
sed --in-place=bak --copy ‘s/John/Johnny/’ employee.txt
-l 选项
指定行的长度,需要和 l 命令配合使用 ( 注意 选项 l 命令 l ,不要弄混了,上面ᨀ到的命令 i
和选项 i 也不要搞错 ) 使用 -l 选项即指定行的长度。也可以使用 --line-length 来代替 .
下面的命令是等价的 :
sed -n -l 20 ‘l’ employee.txt
sed -n --line-length=20 employee.txt
请注意,下面的例子不使用 -l ( 原文是 -n ,应该是弄错 ) 选项,同样可以获取相同的输出 :
sed -n ‘l 20’ employee.txt --posix option

40.打印模式空间(命令 n)

命令 n 打印当前模式空间的内容,然后从输入文件中读取下一行。如果在命令执行过程中遇
n ,那么它会改变正常的执行流程。
打印每一行在模式空间中的内容:
$ sed n employee.txt
101,Johnny Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
如果使用了-n 选项,将没有任何输出:
$ sed -n n employee.txt
$
( 再次ᨀ醒:不要把选项 -n 和命令 n 弄混了 )
前面提到, sed 正常流程是读取数据、执行命令、打印输出、重复循环。
命令 n 可以改变这个流程,它打印当前模式空间的内容,然后清除模式空间,读取下一行进
来,然后继续执行后面的命令。
假定命令 n 前后各有两个其他命令,如下 :
sed-command-1
sed-command-2
n
sed-command-3
sed-command-4
这种情况下, sed-command-1 sed-command-2 会在当前模式空间中执行,然后遇到 n ,它
打印当前模式空间的内容,并清空模式空间,读取下一行,然后把 sed-command-3
sed-command-4 应用于新的模式空间的内容。
提示:上面的例子中可以看到,命令 n 本身没有多大用处,然而当它和保持空间的命令配合
使用时,就很强大了,后面会详细解释。

资料来源于《SedandAwk101Hacks》,大家有兴趣可以买一本,也可以关注我,我更新完它。

曾经,我花费大半月将它们跑完,现在啥都忘了,还是要常用。

只为学习交流,不为获利,侵权联系立删。

相关推荐

  1. windows ubuntu:sed,awk,grep5.sed 附加命令

    2024-05-04 21:48:03       12 阅读
  2. windows ubuntu sed,awk,grep:2:sed 替换命令

    2024-05-04 21:48:03       12 阅读
  3. Linux sed 命令

    2024-05-04 21:48:03       42 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-04 21:48:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-04 21:48:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-04 21:48:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-04 21:48:03       20 阅读

热门阅读

  1. GitHacker:Git源码泄漏检测工具可恢复整个Git Repo

    2024-05-04 21:48:03       10 阅读
  2. 由混淆依赖所引起的RCE

    2024-05-04 21:48:03       10 阅读
  3. 深入探索Elasticsearch中的QueryBuilders

    2024-05-04 21:48:03       10 阅读
  4. 每日一算法

    2024-05-04 21:48:03       11 阅读
  5. 深入探索 Vue 中的 createVNode 与 resolveComponent

    2024-05-04 21:48:03       10 阅读
  6. TS 泛型

    2024-05-04 21:48:03       9 阅读
  7. 基于 V2G 技术的电动汽车实时调度策略

    2024-05-04 21:48:03       9 阅读
  8. CentOS中常用的命令

    2024-05-04 21:48:03       7 阅读