0%

sed命令

一、常用用法

1
sed [-r] -e 'sed脚本' 文件路径

备注:
一般情况下,既可以使用“双引号(“”)”,也可以使用“单引号(‘’)”,来括起“sed脚本”,但是在有些情况下,使用“双引号(“”)”会导致命令解析错误。

二、含义与选项

2.1、含义

根据预先设定的规则,对文件内的内容进行编辑,以“行”为基本操作单元。

2.2、选项表示的意思

“-r”:表示sed脚本中使用的正则表达式是扩展正则表达式(即GNU ERE),而不是基本正则表达式(即GNU BRE)。
“-e sed脚本”:指定需要执行的sed脚本。
“文件路径”:待修改内容的文件路径。

三、sed脚本说明

sed脚本可以写得十分复杂,但是我们一般只需用sed脚本完成“增删改”操作即可。“增删改”的操作范围有“整体范围”和“指定范围”之分。

3.1、整体范围

操作对象是文件内所有内容。
为了方便进行实验,特建立文件“a.txt”,它的内容如下:

1
2
hello
world

3.1.1、增

“增”可分为“行前增”和“行后增”。相应的sed脚本语法分别为:i\texta\text
执行sed -e 'i\1' a.txt命令,结果如图1所示。

图1

执行sed -e 'a\1' a.txt命令,结果如图2所示。

图2

3.1.2、删

相应的sed脚本语法为d
执行sed -e 'd' a.txt命令,结果如图3所示。图3表示所有内容被删除,打印内容为空。

图3

3.1.3、改

“改”可分为“整行替换”,“字母替换”和“字符串替换”。

3.1.3.1、整行替换

相应的sed脚本语法为:c\text
执行sed -e 'c\dsl' a.txt命令,结果如图4所示。

图4

3.1.3.2、字母替换

相应的sed脚本语法为:y/source/dest/。注意“source”和“dest”中字母数量必须一致,“source”中某个位置的字母会被替换成“dest”中对应位置的字母。
执行sed -e 'y/abcde/ABCDE/' a.txt命令,结果如图5所示。

图5

3.1.3.3、字符串替换

相应的sed脚本语法为:s/regexp/replacement/注意在“replacement”中可以有以下两类特殊字符:“\0”和“\1-9”。“\0”表示指代完整正则表达式所匹配的内容,“\1-9”表示相应的正则表达式单元所匹配的内容。

执行sed -r -e 's/el/lelele/' a.txt命令,结果如图6所示。

图6

执行sed -e 's/[l]+/lelele/' a.txt命令,结果如图7所示。

图7

执行sed -r -e 's/[l]+/lelele/' a.txt命令,结果如图8所示。

图8

图7和图8的结果验证了加“-r”选项与不加“-r”选项的区别,加“-r”选项表示使用“GNU ERE正则表达式”,而不加“-r”选项表示使用“GNU BRE正则表达式”。

执行sed -r -e 's/([l]+)(o|d)/\0\2\0/' a.txt命令,结果如图9所示。

图9

这是实验了“replacement”中的“\0”和“\1-9”这两类特殊字符。

3.2、指定范围

操作对象是文件指定范围内的内容,最常见的指定范围的方式是“通过正则表达式(这里使用的正则表达式是‘GNU ERE’还是‘GNU BRE’,依旧由上面提及到的‘-r’选项所控制)”,具体的语法形式如下,其中加上“!”表示最终的“指定范围”是“/regexp/”所指定范围的补集范围:

1
/regexp/[!]

举例子进行说明,现在有一个文件“b.txt”,内容如下:

1
2
3
###a comment
hello world
###b comment

执行sed -r -e '/[#]+/d' b.txt命令,结果如图10所示。

图10

执行sed -r -e '/[#]+/!d' b.txt命令,结果如图11所示。

图11


参考文献

[1]man sed

您的支持将鼓励我继续分享!