在 bash 中使用 sed 替换 csv 行的第 n 个值

Posted

技术标签:

【中文标题】在 bash 中使用 sed 替换 csv 行的第 n 个值【英文标题】:replace nth value of a csv line using sed in bash 【发布时间】:2021-10-16 22:28:23 【问题描述】:

我有一些像下面这样的 csv

uid_01, joe, yes, no 
uid_02, sam, yes, maybe
uid_03, c, ruth, yes, maybe
uid_04, **alan**, no, yes

我想用 ruby 替换 alan,uid 在这里是唯一的。我需要根据 $position 进行更改,知道如何在 sed 中获得它吗?

我还想同时给出模式和替换值作为参数。

尝试过类似的方法,但仅在最后一次输入时有效

sed -i '/^'$uid',/s/[^,]*$/'$returnvalue'/' $OUTPUT

先谢谢了,请帮忙!

【问题讨论】:

【参考方案1】:

awk 更适合:

awk -v id='uid_04' -v repl='ruby' 'BEGIN FS=OFS=", "
$1 == id $2 = repl 1' file.csv

uid_01, joe, yes, no
uid_02, sam, yes, maybe
uid_03, c, ruth, yes, maybe
uid_04, ruby, no, yes

【讨论】:

谢谢。有没有办法在不复制的情况下覆盖同一个文件? 如果您有gnu-awk,请使用awk -i inplace -v id='uid_04' -v repl='ruby' 'BEGIN FS=OFS=", " $1 == id $2 = repl 1' file.csv @SankaranKutty 每个具有启用“就地”编辑选项的 Unix 工具(gawk -i inplaceperl -iruby -ised -i 等)都会获取文件的副本,因此- 您真的是否关心获取文件的副本,或者您只是不想在代码中使用cmd file > tmp && mv tmp file 明确地执行此操作,而是更喜欢cmd -i filecmd -i inplace file awk -v id1=$id -v repl='PASS' 'BEGIN FS=OFS="," ($1 == id1)$6 = repl 1' $OUTPUT > tmp && mv tmp $OUTPUT 使它工作,谢谢大家。 :) @EdMorton - 新手,gawk 没有出现在盒子里,所以我会暂时使用这个。感谢您的回复。 @anubhava 谢谢你能告诉我 1 附近的文件名是做什么的吗?【参考方案2】:

这可能对你有用(GNU sed):

id='uid_04' name='ruby' position=2
sed -i "/^$id,/s/[^,]*/ $name/$position" file

如果 id 是uid_04,则将第二个字段替换为ruby

【讨论】:

对不起,它不起作用,sed:替换表达式中的错误选项

以上是关于在 bash 中使用 sed 替换 csv 行的第 n 个值的主要内容,如果未能解决你的问题,请参考以下文章

Bash:如何使用 sed 仅替换文件中的最后一次出现?

如何在没有sed的情况下替换csv文件中的一行[重复]

sed匹配与替换

使用 Sed Mac 终端查找和替换空格

使用 bash (sed/awk) 提取 CSV 文件中的行和列?

sed - 替换IP地址上的第二个八位字节