如何使用 sed/awk 将第 n 列替换为列分隔字符串

如何使用 sed/awk 将第 n 列替换为列分隔字符串

假设我有这样的字符串:

xyz="123" ; acd="234" ; plk="1234" ; apl="3456" ; www="2342"

现在我想通过忽略和来替换plk="123"为使用 sed 。plk="789";""

输出:

xyz="123" ; acd="234" ; plk="789" ; apl="3456" ; www="2342

请帮我解决这个问题,并告诉我是否可以使用其他命令。

答案1

要替换plk="1234"plk="789",您可以执行以下操作:

$ sed 's/plk="1234"/plk="789"/g' file
xyz="123" ; acd="234" ; plk="789" ; apl="3456" ; www="2342"

但是,这也将替换notplk="1234"plk="789".为了避免这种情况,您可以使用\<它只匹配单词边界:

$ sed 's/\<plk="1234"/plk="789"/g' file
xyz="123" ; acd="234" ; plk="789" ; apl="3456" ; www="2342"

我不确定它\<是否 100% 便携,所以以防万一,你也可以这样做:

$ sed -E 's/(^| )plk="1234"/plk="789"/g' file
xyz="123" ; acd="234" ;plk="789" ; apl="3456" ; www="2342"

或者使用 Perl 代替:

$ perl -pe 's/\bplk="1234"/plk="789"/g' file
xyz="123" ; acd="234" ; plk="789" ; apl="3456" ; www="2342"

使用上述所有命令( 和sedperl,您可以添加-i标志以就地编辑原始文件。


上面的命令将替换全部plk="1234"文件每一行中出现 的次数。您没有在问题中进行解释,但在标题中提到了“第 n 列”。我不知道你如何定义列或你的意思,但如果你的意思是你只想在第三个;分隔列上进行此替换,你可以尝试这个(使用 GNU awk):

$ awk -F';'  'BEGIN{OFS=";"}{$3=gensub(/plk="1234"/,"plk=\"789\"",1,$3); }1' file
xyz="123" ; acd="234" ; plk="789" ; apl="3456" ; www="2342"

相关内容