这类似于以下问题:
Ignore comments (#) using sed, but keep the lines untouched
然而,区别在于我没有进行一次替换,而是使用了几个替换的sed脚本文件。
我想我可以编辑脚本的每一行:
/^#/!s/orig/replace/g
然而,这对我来说似乎有点太多的复制和粘贴。
有更优雅的方式吗?
我使用的脚本是:
答案 0 :(得分:3)
您可以使用块:
/^#/!{s/a/b/;s/c/d/}
答案 1 :(得分:1)
你可以在脚本中使用awk而不是sed吗?一个sed脚本:
s/orig/replace/g
s/\(foo\)bar/\1dog/
可以逐行转换为GNU awk脚本:
{
$0=gensub(/orig/,"replace","g")
$0=gensub(/(foo)bar/,"\\1dog","")
}
{ print }
然后如果你不想处理以#开头的行,那么在进入动作块之前对awk脚本进行一个微不足道的调整以测试该条件:
!/^#/ {
$0=gensub(/orig/,"replace","g")
$0=gensub(/(foo)bar/,"\\1dog","")
}
{ print }
如果你想这样做,这是你的sed脚本中的前几次转换,以帮助你实现目标:
# s=^"=`` =g
$0 = gensub(/^"/,"``","g")
# s=\([ ([{<]\)"=\1 `` =g
$0 = gensub(/([ ([{<])"/"\\1 ``","g")
# s=\.\.\.= ... =g
$0 = gensub(/\.\.\./," ... ","g")
# s=[,;:@#$%&]= & =g
$0 = gensub(/[,;:@#$%&]/," & ","g")
# s=\([^.]\)\([.]\)\([])}>"']*\)[ ]*$=\1 \2\3 =g
$0 = gensub(/([^.])([.])([])}>"']*)[ ]*$/,"\\1 \\2\\3","g")
主要是您只需将问号中的\(
更改为awk中的(
,将\1
更改为awk中的\\1
。