【问题标题】:Combining two sed commands结合两个 sed 命令
【发布时间】:2011-12-01 05:46:48
【问题描述】:

我有一个文件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

【问题讨论】:

    标签: sed


    【解决方案1】:

    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 标志是确保在编写 oneliner sed 脚本时终止“i”命令的好方法。
    • 切线另见stackoverflow.com/questions/35253663/…,它将其扩展到处理替换对列表。
    【解决方案2】:

    使用-e 标志:

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

    一旦你得到的命令比-es 定义的方便,最好将命令存储在一个单独的文件中,并用-f 标志包含它。

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

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

    我们称该文件为“sedcommands”。然后你可以像这样将它与 sed 一起使用:

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

    只有两个命令,可能不值得使用单独的命令文件,但如果您需要进行大量转换,则非常方便。

    【讨论】:

    • -f 标志背后的想法是什么?
    • 他当然试图解释。使用-f,您可以将脚本放在文件中,而不是放在sed 命令行中。 (在这种情况下,它可能不是很有用。)
    猜你喜欢
    • 2015-01-30
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 2015-01-29
    • 2022-07-06
    • 2012-09-12
    • 1970-01-01
    • 2012-06-05
    相关资源
    最近更新 更多