找到一行并替换一个字符串

时间:2014-03-12 19:34:48

标签: linux bash shell sed

我有一个包含多行的文本文件。我将使用sed替换其中一行中的逗号分隔值。每行的开头都有一个ID(基本上是记录ID)。我需要确定使用ID进行修改的正确行。我曾经考虑过逐行阅读文件直到找到它,但我很好奇还有另外一种方法吗?

3 个答案:

答案 0 :(得分:1)

sed -e '/^theID,/s/oldValue/newValue/'

答案 1 :(得分:0)

对于这种特殊情况,awk或Perl可能会更好

这将取代" foo"用" bar"在您的文件中与第一列中的yourID匹配的行

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

或perl oneliners,这里用#34; bar"交换第3列。其中line与第一列中的yourID匹配。

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

答案 2 :(得分: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

如果要替换文件就地,可以添加-i开关,以便:

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

但实际上应该在这里使用像perl的Text::CSV解析器这样的合适的CSV。