Linux 下使用 sed 批量替换文本内容

张贤 2020年03月09日 89次浏览

sed 命令的全名是 stream editor,是 Linux 上非常强大的流编辑器,适用于对文本的行内容进行处理。
下面是一个例子:


Test.java文件中有 3 行代码,如上图所示,想要把每行开头的Str替换为String,使用sed 's/^Str/String/' Test.java,其中s表示进行字符串处理,三个反斜杠/是分隔符(也可以使用其他分隔符,如#),第一个反斜杠和第二个反斜杠之间表示行中需要替换的字符串,^Str表示以Str开头的字符串,第二个反斜杠和第三个反斜杠之间表示替换后的字符串。


但是此时替换后的文本只是输出到了终端中,并没有保存到文件中。如果需要把修改保存到文件中,可以使用 -i 参数:`sed -i 's/^Str/String/' Test.java`。 如果要把每行最后的`.`替换为`;`,则使用`sed -i 's/\.$/\;/' Test.java`,由于`,`和`;`在 sed 中都是特殊字符,因此需要转义。 如果想要把`Jack`替换为`me`,使用`sed 's/Jack/me/' Test.java`结果如下:

可以看到第二行除了首个Jack被替换成me以外,后面两个Jack没有被替换,sed 默认只替换每一行首个符合条件的字符串,如果需要进行全文替换,则要加上g选项:sed 's/Jack/me/g' Test.java


sed 不仅可以对文本内容进行批量替换,还可以根据规则批量删除内容。 比如`sed -i '/^ *$/d' Test.java`的作用是删除文本中的空行,`sed -i '/String/d' Test.java`的作用是删除文本中包含`String`的行。