1

这类似于以下问题:

使用 sed 忽略注释 (#),但保持行不变

但是,不同之处在于,我没有进行一次替换,而是使用 sed 脚本文件进行了几次替换。

我想我可以将脚本的每一行都编辑为以下形式:

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

但是,对我来说,这似乎有点过多的复制和粘贴。

有没有更优雅的方式?

我正在使用的脚本是:

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

4

2 回答 2

4

您可以使用块:

/^#/!{s/a/b/;s/c/d/}
于 2013-02-18T10:07:08.233 回答
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")

主要是您只需将\(sed更改为(awk,并将\1sed 更改\\1为 awk。

于 2013-02-18T10:16:23.277 回答