2013-02-18 66 views
0

这是类似以下问题:忽略注释(#),但保持不变线

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

然而,不同的是,而不是有一个替代我已经用sed脚本 - 文件与几个替代文件。

我想我可以编辑脚本的每一条线路是在形式:

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

然而,这似乎是有点过分复制和粘贴的给我。

有没有更优雅的方式?

我使用的脚本是:

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

回答

3

您可以使用块:

/^#/!{s/a/b/;s/c/d/} 
+0

谢谢!我不知道在这一点上可以使用一个块......我转换了scipt,但是现在得到'/ bin/sed:file bin/tokenize2.sed第2行:命令后面的额外字符我将转换现在逐行扫描... – benroth 2013-02-18 10:47:15

+0

@benroth:在一些非GNU seds中,您可能必须使用换行符而不是';'来分隔命令。 – choroba 2013-02-18 10:49:34

+0

现在非常棒!干净又干净! – benroth 2013-02-18 10:58:47

1

您可以用awk,而不是在脚本中的sed?

s/orig/replace/g 
s/\(foo\)bar/\1dog/ 

可转换一行行的GNU awk脚本:

{ 
    $0=gensub(/orig/,"replace","g") 
    $0=gensub(/(foo)bar/,"\\1dog","") 
} 
{ print } 

,然后如果你不想处理以#开头的行这是一个的sed脚本琐碎的调整到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 sed将\\1 sed将(在awk和\1

+0

是的,看起来我是这样做的,但我必须编写另一个unix工具命令来转换脚本。 :) – benroth 2013-02-18 10:21:34

+0

我实际上认为你只需要花20分钟左右就可以手动将sed脚本转换为gawk,然后在它前面添加'!/ ^#/'。 – 2013-02-18 10:37:00

+0

当然,这就是我要做的 - 只是认为可能有一个简单的补充,我迄今还没有。 – benroth 2013-02-18 10:44:02