2014-03-12 37 views
0

我有一個包含多行的文本文件。我將使用sed替換其中一行中的逗號分隔值。每行開頭都有一個ID(本質上是Record ID)。我需要通過使用ID來識別正確的行來修改。我曾考慮過逐行閱讀文件,直到找到它,但我很好奇是否有另一種方式?找到一條線並替換一個字符串

+0

sed是完美的。如果沒有更多的細節,很難更具體。 – AlG

回答

1
sed -e '/^theID,/s/oldValue/newValue/' 
+0

啊!我會盡力的,謝謝! – Atomiklan

+0

這是錯誤的,如果您當前的行ID是123並且給定的ID是2,那該怎麼辦? –

+0

好點 - 已更新,因爲記錄ID在行的開頭,後面跟着一個,因爲該文件是CSV。 – user3392484

0

在awk或Perl可能是這種特殊情況下

這裏這更好的將取代「富」與這是由yourID第一列相匹配的線在你的文件「欄中的」

awk -F ',' '/yourID/ {gsub("foo", "bar", $2); print}' fileIn > fileOut 

或perl oneliners,此處將第三列與第一列中與yourID匹配的「bar」交換。

perl -F',' -lane 'if(@F[0] =~ m/yourID/){ @F[2] = "bar"; print(join(", ", @F))}' fileIn > fileOut 
+0

更好地使用'eq'而不是'm //'! –

0

其他的解決方案似乎不可靠(ID沒有測試正確),所以這是我做到這一點的方法:

$ cat file 
001,a,b,c 
002,a2,b2,c2 

$ perl -F, -lane '$F[0] eq "002" and $F[1] = "z"; print join ",", @F' file 
001,a,b,c 
002,z,b2,c2 

如果您要更換的部份文件IN-將,你可以添加-i開關,所以:

$ perl -i -F, -lane '$F[0] eq "002" and $F[1] = "z"; print join ",", @F' file 

但正確的CSV像Perl的Text::CSV解析器建議立即進行刪除d實際上在這裏使用。

相關問題