合并两个sed命令

71

我有一个文件r。我想把里面的单词FileMINvac.pdb替换成空。我使用的命令是

sed -i 's/File//g' /home/kanika/standard_minimizer_prosee/r

sed -i 's/MINvac.pdb//g' /home/kanika/standard_minimizer_prosee/r

我想将这两个sed命令合并为一个,但我不知道怎么做。有人可以帮忙吗?

文件内容如下:

-6174.27    File10MINvac.pdb
-514.451    File11MINvac.pdb
4065.68     File12MINvac.pdb
-4708.64    File13MINvac.pdb
6674.54     File14MINvac.pdb
8563.58     File15MINvac.pdb

对于更复杂的情况,可以参考 https://dev59.com/WHsPtIcB2Jgan1zn7xbP - tripleee
2个回答

104

sed 是一种脚本语言。你可以用分号或换行符来分隔命令。许多 sed 方言还允许你将每个命令作为单独的 -e 选项参数传递。

sed -i 's/File//g;s/MINvac\.pdb//g' /home/kanika/standard_minimizer_prosee/r

我还在pdb之前添加了反斜杠以正确引用字面点,但在这种有限的上下文中,这可能并不重要。

为了完整起见,这里是换行符变量。许多新手对于shell允许在带引号的字符串中包含字面换行符感到困惑,但它确实很方便。

sed -i 's/File//g
    s/MINvac\.pdb//g' /home/kanika/standard_minimizer_prosee/r

当然,在这种有限的情况下,您也可以将所有内容合并为一个正则表达式:

sed -i 's/\(File\|MINvac\.pdb\)//g' /home/kanika/standard_minimizer_prosee/r

(一些sed方言可能需要去掉反斜杠,并/或者提供使用扩展正则表达式的选项,此时应省略反斜杠。BSD sed,因此也包括MacOS sed,要求对sed -i使用强制选项,但可以为空,例如:sed -i ''。)


感谢您提供有关在脚本中使用多个-e标志的提示,每个语句一个标志。为'i'命令单独设置一个-e标志是确保在编写一行sed脚本时'i'命令得到终止的好方法。 - IllvilJa
顺带提一句,也可以参考 https://stackoverflow.com/questions/35253663/linux-find-replace-on-a-folder-of-files-using-a-list-of-items-for-replacement,该链接将其扩展为处理替换对列表。 - tripleee

51

使用 -e 标志:

sed -i -e 's/File//g' -e 's/MINvac.pdb//g' /home/kanika/standard_minimizer_prosee/r

当您有更多的命令需要定义而使用-e不方便时,最好将命令存储在单独的文件中,并使用-f标志进行包含。

在这种情况下,您可以创建一个包含以下内容的文件:

s/File//g
s/MINvac.pdb//g

让我们称那个文件为'sedcommands'。然后你可以像这样使用sed:

sed -i -f sedcommands /home/kanika/standard_minimizer_prosee/r

只有两个命令的话,使用单独的命令文件可能没有必要,但如果你需要进行大量的变换,这是非常方便的。


“-f”标志的背后理念是什么? - kanika
5
他确实试图解释它。使用 -f 选项,你可以将脚本放入一个文件中,而不是在 sed 命令行上输入。 (在这种情况下,这可能没有太大用处,不过还是让你知道一下。) - tripleee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接