所在位置:

sed进阶

sed 有一些比较复杂的功能,这些功能在工作中可能会用到,所以这里也记录一下,最主要是模式空间的暂存空间的理解,这两个空间如何交换数据,如何删除数据,还要注意添加 \n 和不加 \n 的区别等等

多输入行函数

N 参数

在模式空间中把下一行添加到当前行之后,两个输入行用一个内嵌的换行分隔

D 参数

删除当前模式空间中直到并包括第一个换行字符的所有字符

P 参数

打印模式空间中的直到并包括第一个换行的所有字符。

保存和取回函数

h 参数

h 函数把模式空间的内容复制到保存区域(销毁保存区域以前的内容)

H 参数

H 函数把模式空间的内容添加到保存区域的内容之后,以前和新的内容用换行分隔

g 参数

g 函数把保存区域的内容复制到模式空间(销毁模式空间以前的内容)

G 参数

G 函数把保存区域的内容添加到模式空间的内容之后,以前和新的内容用换行分隔

x 参数

对换命令交换模式空间和保存区域的内容

举例

示例文件
The old man was thin and gaunt with deep wrinkles in the back of his neck.
The brown blotches of the benevolent skin cancer the sun
 this is a 135 test 135.
124  56 3433 33
    But none of 3 these scars were fresh.
They were as old as erosions in a fishless desert.

as as as as as    as as deeep


1 one test \abc good ao scars were fresh one 1.
asdf jas df hao-test asdf dsafjdasf
h.ao ais js bin
bash
在每一行后面加一个空行
sed -e 'G' test.txt

说明:,由于暂存空间给模式空间添加了 \n,所以会出现空行

删除文件的所有空行,然后在每一行后面加一个空行
sed '/^$/d;G' test.txt
给第二行和第三行前面和后面都加上一个空行
sed -e '2,3{x;p;x;G}' test.txt

说明: 由于 x 是交换 暂存空间和模式空间的内容,所以会先打印空行,再打印内容,然后 G 的话,会给模式空间添加 \n,所以会打印空行,就出现了匹配的行前后出现空行

每两行拼成一行,并用 :: 来连接
sed '$!N;s/\n/::/' test.txt

说明: 把不是最后那一行的所有行的下一行都添加到模式空间的当前行,并且用 \n 追加,所以替换 \n 就可以把下一行合并到上一行中

显示最后两行
sed -e '$!N;$!D' test.txt

说明:,先把不是最后一行的所有行用 \n 添加到模式空间,然后,再删除模式空间里不是最后一行的所有行,也就是倒数第二行,然后再显示最后一行

【上一篇】15个有用的sed命令技巧应用于日常Linux系统管理任务【翻译】

【下一篇】ansible的安装和基本用法