使用sed脚本忽略注释(#),但保持线条不变

时间:2013-02-18 10:04:23

标签: regex shell sed

这类似于以下问题:

Ignore comments (#) using sed, but keep the lines untouched

然而,区别在于我没有进行一次替换,而是使用了几个替换的sed脚本文件。

我想我可以编辑脚本的每一行:

/^#/!s/orig/replace/g

然而,这对我来说似乎有点太多的复制和粘贴。

有更优雅的方式吗?

我使用的脚本是:

http://www.cis.upenn.edu/~treebank/tokenizer.sed

2 个答案:

答案 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