sed 如何在一个字段中找到模式但附加另一个字段(同一行)

sed 如何在一个字段中找到模式但附加另一个字段(同一行)

我有一个文本文件,其中包含逗号分隔的值。字段 1 中有需要匹配的字段,但字段 2 需要根据匹配进行替换。

例子:

A、C
B、C

结果:
A、D
B、C

我猜命令看起来或多或少类似于:

sed 's/A/D/'

谢谢

答案1

这个怎么样

$ echo A,fgfdgd|sed -r 's/A,[^,]*/A,D/'
A,D

如果第一列是 A,然后有一个逗号,第二列中有 whatever,它会用 A,D 替换全部内容。只有当它匹配第一列中的 A(后跟第二列中的逗号和 whatever)时才会发生这种情况。

文件示例

这会将您的示例转换为结果。因此,如果第一列为 A,则第二列变为 D。

$ cat a.b
A,C
B,C


$ sed -r 's/A,[^,]*/A,D/' a.b
A,D
B,C


$

答案2

使用地址表达式选择要编辑的行,然后使用正则替换来实际执行替换。sed 的一个有趣之处在于,在“s”命令之前,您可以指定行号或正则表达式来选择您关心的行(地址也可以是用逗号分隔的开始和结束,指定“地址范围”内包含的所有行,但省略第二部分会选择单行)。

在您的地址表达式中,寻找“不是逗号,后面跟着您想要的内容”。

在替换中,记住模式之前的内容,然后将“之前”部分放在替换字符串之前。记住“之前”部分是因为您希望之前的内容只包含一个逗号,不多也不少。这里显示它匹配第一个字段,并且只影响第二个字段;我将第一列中与“atter”匹配的行的第二列中的“la”替换为“moo”。

$ echo -e "pattern,blah,aaa\npattern,bleh,stuff" | sed '/[^,]*atter/s/\(^[^,]*,[^,]*\)la/\1moo/g'
pattern,bmooh,aaa
pattern,bleh,stuff

仅此一项无法正确处理字段中的转义逗号,因此希望您的 CSV 文件很简单。:)

相关内容