2015-12-29 36 views
-2

我有一個文件說tmp.txt下面。sed匹配字符串的一部分,但只修改某些部分(或awk,如果這可能更簡單)

root:cDJZp9SHD2KhVgc:0:0:99999:7::: 
    bin:*:12821:0:99999:7::: 
    daemon:*:12811:0:99999:7::: 
    adm:*:12811:0:99999:7::: 
    lp:*:12811:0:99999:7::: 

我想改變'999999'的第一個出現,只在第一行0。可能是這個文件已被修改,所以第一行如下所示。

root:cDJZp9SHD2KhVgc:999999:0:99999:7::: 

所以我想匹配沿'root:\w:0'線的東西,只有修改爲0。有沒有辦法爲一個字符串的這一部分匹配,並指示一定的部分(在這種情況下,0) ,只能用sed修改?或者有沒有更好的方法來用awk做到這一點?

回答

1
$ sed -r '1s/([a-zA-Z]:)0/\199999/' file 

root:cDJZp9SHD2KhVgc:99999:0:99999:7::: 
bin:*:12821:0:99999:7::: 
daemon:*:12811:0:99999:7::: 
adm:*:12811:0:99999:7::: 
lp:*:12811:0:99999:7::: 
+0

感謝的快速反應@karakfa。你能解釋一下-r選項的作用嗎?文檔只是說「在腳本中使用擴展的正則表達式」。正則表達式的 –

+0

,即分組和'\ 1' – karakfa

0

如果你想改變在第一行的第三個字段爲「999999」,當且僅當它是完全等於「0」,然後進行簡單和直接的方式這樣做是使用AWK如下所示:

awk -F: 'BEGIN{OFS=FS} NR==1 && $3 == "0" {$3 = "999999"} {print}' 

使用sed可以達到同樣的效果,但它並不十分簡單或不可讀。

(這裏的awk的另一個優點是不必處理的sed -r/-E選項的非標準性質。)