2013-02-18 94 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