我想为与多个命令的sed
或and
匹配的任何行执行一些or
命令:例如,sed '50,70/abc/d'
将删除范围中的所有行{匹配50,70
的{1}},或无法重新输入/abc/
的{{1}} {/ 1}}
答案 0 :(得分:10)
and
部分可以用大括号完成:
sed '50,70{/abc/d;}'
此外,大括号可以嵌套多个and
条件。
(上述内容是在GNU sed
下进行测试的.BSD sed
可能会因为细节但令人沮丧的细节而有所不同。)
可以使用分支处理or
部分:
sed -e '10,20{b cr;}' -e '30,40{b cr;}' -e b -e :cr -e 's/complicated/regex/' file
10,20{b cr;}
对于从10到20的所有行,我们分支到标签cr
30,40{b cr;}
对于30到40之间的所有行,我们分支到标签cr
b
对于所有其他行,我们跳过其余的命令。
:cr
这标志着标签cr
s/complicated/regex/
这将在分支为cr
。
使用GNU sed
,上面的语法可以缩短为:
sed '10,20{b cr}; 30,40{b cr}; b; :cr; s/complicated/regex/' file
答案 1 :(得分:3)
要删除10到20和30到40之间的行,将复杂的正则表达式与GNU sed匹配:
sed -e '10,20bA;30,40bA;b;:A;s/complicated/regex/;d' file
或:
sed -e '10,20bA' -e '30,40bA' -e 'b;:A;s/complicated/regex/;d' file
<小时/>
bA
:跳转到标签:A
b
:没有标签的跳转 - &gt;跳到脚本结尾
d
:删除行
答案 2 :(得分:1)
我不认为sed
具有多个选择标准的便利,我的建议是升级到awk
,你可以在那里做类似的事情:
awk 'NR >= 50 && NR <= 70 && /abc/ {next} {print}' inputFile
awk '(NR >= 10 and NR <= 20) || (NR >= 30 && NR <= 40) {
sub("from-regex", "to-string", $0); print }'
答案 3 :(得分:0)
sed非常适合单个行上的简单替换,但对于其他任何东西,只需使用awk以获得清晰度,健壮性,可移植性,可维护性等等。
awk '
(NR>=50 && NR<=70) && /abc/ { next }
(NR>=10 && NR<=20) || (NR>=30 && NR<=40) { sub(/complicated/,"regex") }
{ print }
' file