![sed 如何在一个字段中找到模式但附加另一个字段(同一行)](https://linux22.com/image/1398457/sed%20%E5%A6%82%E4%BD%95%E5%9C%A8%E4%B8%80%E4%B8%AA%E5%AD%97%E6%AE%B5%E4%B8%AD%E6%89%BE%E5%88%B0%E6%A8%A1%E5%BC%8F%E4%BD%86%E9%99%84%E5%8A%A0%E5%8F%A6%E4%B8%80%E4%B8%AA%E5%AD%97%E6%AE%B5%EF%BC%88%E5%90%8C%E4%B8%80%E8%A1%8C%EF%BC%89.png)
我有一个文本文件,其中包含逗号分隔的值。字段 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 文件很简单。:)