2009-09-22 223 views
0

我得到一個文檔,字段之間用冒號分隔(:),我需要不時更改第二個字段。該文件看起來是這樣的:sed:搜索並替換不同的列

name1:UhX.PPFW7$YhPMH0BISY:23490:::::: 
name2:1./0oV$GEs6WJpE$LHXhy:19239:0:29388:2::29302: 
... 

文件的第二場偶爾會發生變化,可能包含一對夫婦正則表達式字符($)和正斜槓。

我想只替換第二個字段,因爲隨後的數據可能在將來會有所不同。如果我:

sed -e "s~^name2:.*:~name2:aTest\$repl.ace:~g" tst 

文本到第二列的右側丟失:

name2:aTest$repl.ace: 

(即, '19239:0:29388:2 :: 29302:')。有沒有一種方法可以代替變化的列並保留行的其餘部分?或者,可能有更好的方案來做到這一點?

回答

0

最簡單的方法是改變。 *在您的正則表達式中僅匹配實際出現在第二個字段中的內容,例如:

sed -e "s~^name2:[^:]*:~name2:aTest\$repl.ace:~g" tst 

([^:] * ==任何不包含冒號),或:

sed -e "s~^name2:[$./0-9a-zA-Z]*:~name2:aTest\$repl.ace:~g" tst 

([等等] * ==任何數量列出的字符的)

+0

嘿,那太好了。想知道這是否可能在sed。以爲我可能正在看一個更復雜的命令。欣賞提示,安東尼。 –

0

Sed可能不是最好的工具,因爲如果真的不知道字段。考慮awk(它有一個內置的領域的概念),而不是:

$ awk -F : 'NF>=2{split($0,a,":");a[2]="new sting";printf(a[1]);for(i=2;i<=NF;i++){printf":%s",a[i]};printf("\n");}' <input file> 

或格式化的可讀性:

awk -F : 'NF>=2 { 
        split($0,a,":"); 
        a[2]="new sting"; 
        printf(a[1]); 
        for(i=2;i<=NF;i++){ 
        printf":%s",a[i] 
        }; 
        printf("\n"); 
       }' <input file> 

對於一般性,你可能希望將":"FS取代。另外值得關注的是,如果您編寫腳本而不是在命令行上運行,這將使實現更清晰。

本實施方式假定您想要替換全部的第二個字段。如果宇只需要選擇一些更換的線條,圖案改爲

$2=="string to match" 

$2~/regex to match/ 
+0

嘿,AWK當時有點過頭了,但它確實有效。謝謝。 –

0

試試這個:

perl -pe 's~^name2:.*?:~name2:aTest\$repl.ace:~g' test 
+0

開始喜歡Perl - 它使用的所有語法(我見過)很容易記住語法。感謝提示ennuikiller。 –