如何将多个sed命令合并为一个

时间:2016-08-24 18:27:02

标签: bash sed

我有4个不同的sed命令,我在一个文件上运行。为了调整这4个命令的性能,我想将它们合并为一个。 每个命令都是带-E开关的复杂命令。搜索了很多论坛,但无法得到我的具体答案。

sed -i -E ':a; s/('"$search_str"'X*)[^X&]/\1X/; ta' "$newfile"
sed -i -E '/[<]ExtData[>?" "]/{:a; /Name=/{/Name="'"$nvp_list_ORed"'"/!b}; /Value=/bb; n; ba; :b; s/(Value="X*)[^X"]/\1X/; tb; }' "$newfile"
sed -i -E ':a; s/('"$search_str1"'X*)[^X\<]/\1X/; ta' "$newfile"
sed -i -E ':a; s/('"$search_str2"'X*)[^X\/]/\1X/; ta' "$newfile"

我想把它们结合起来说像

  

sed -i -E&#39; command1&#39; -e&#39; command2&#39; -e&#39; command3&#39; -e&#39; command4&#39;   &#34; $的newfile&#34;

但它不起作用。因为可能是-E和-e无法结合。

请告诉我。

谢谢!!普尼特

4 个答案:

答案 0 :(得分:3)

-E表示“扩展正则表达式”并且是独立标记,-e表示“表达式”,必须后跟sed表达式。
您可以将它们组合在一起,但如果您需要多个sed表达式-e,则每个sed -i -E -e 'command1' -e 'command2' -e 'command3' -e 'command4' "$newfile" 表达式都必须以sed -i -E 'command1;command2;command3;command4' "$newfile" 开头,而不是您的第一个表达式。

sed

第二个选项是在同一个表达式中编写每个命令:

-f

但是,由于您使用标签,我不会依赖此选项;某些实现可能不支持John1024指出。

最后,正如Mad Physicist所提到的,您可以将\表达式写入您通过<span class='http_method'> <a href='test' class="toggleOperation"> <span class="fa fa-angle-down"></span> method</a> </span> 选项引用的文件。
该文件必须按行包含单个sed表达式(您可以通过为每行添加后缀来编写多行表达式,但最后添加span { margin: 0; margin-left: 10px; padding: 0; } .http_method a{ background: linear-gradient(#4c99d7,#1a66a3); border: 1px solid #1a66a3; height: 25px; line-height: 10px; vertical-align: middle; } .http_method span{ font-size: 30px; margin-right: 10px; padding-left: 10px; vertical-align: middle; color: #686b6d; } ,从而转义换行符。)

答案 1 :(得分:2)

简单地管道:

sed -E 'A' file | sed -E 'B' | ... >file.tmp && mv file.tmp file

答案 2 :(得分:2)

正如@Aaron所观察到的,如果要为sed提供多个单独的表达式,则必须将它们指定为-e个选项;他们将合并。您还可以通过用分号分隔这些片段将一堆表达式合并为一个。

您的情况有点特殊:您的特定表达式使用标签和分支指令,其中一个标签名称(a)在每个表达式中重复。为了组合这些,每个标签应该是不同的,每个分支(条件和绝对)应指定正确的标签。这看起来像这样:

sed -i -E \
    -e ':a1; s/('"$search_str"'X*)[^X&]/\1X/; ta1' \
    -e '/[<]ExtData[>?" "]/ {:a2; /Name=/ {/Name="'"$nvp_list_ORed"'"/ !b}; /Value=/ bb2; n; ba2; :b2; s/(Value="X*)[^X"]/\1X/; tb2; }' \
    -e ':a3; s/('"$search_str1"'X*)[^X\<]/\1X/; ta3' \
    -e ':a4; s/('"$search_str2"'X*)[^X\/]/\1X/; ta4' \
    "$newfile"

请注意,即使从shell perspsective中正确引用,如果任何插值shell变量的值包含正则表达式元字符,您的方法也不会按预期执行。

答案 3 :(得分:0)

警告: 将多个 sed 脚本组合成一个而不进行更改并不总是可能的。有时您可能需要重新设计算法。


sed make 有两个内存概念。模式空间和保持空间。只有当这两个空格在两个 sed 命令中相同时,连接才有效。您可以在下面找到模式空间发生变化的示例:

$ echo aa | sed -e 's/./&\n/' | sed -e '1s/a/b/g'
b
a
$ echo aa | sed -e 's/./&\n/' -e '1s/a/b/g'
b
b
$ echo aa | gsed -e 's/./&\n/;1s/a/b/g'
b
b

在原始管道中,第一个 sed 命令作用于模式空间 aa,而第二个脚本的模式空间只有 a