我有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无法结合。
请告诉我。
谢谢!!普尼特
答案 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
。