首页 > 解决方案 > 用 sed 替换正则表达式的第 N 个匹配项

问题描述

我有一个看起来像这样的数据集:

1099511629352|Nunez|Jorge|female|17/11/2000|2011-04-04T05:54:52.693+0000|201.221.59.59|Opera|Facebook

在这种情况下,列分隔符是|-> 我想$pos使用 sed 替换给定一行 id 的第 N 列 ( )。

这是我现在想出的:

所以适当的 sed 命令是:

sed "/^$id/[$columnsep]*[a-zA-Z0-9./\-:+]+/$columnsep$editvalue/$pos}" $file

我明白[a- ...": invalid command code [了,尽管它适用于https://regexr.com/等在线正则表达式测试器

标签: regexsedreplace

解决方案


$columnsep除非长于一个字符,否则这样的东西就可以完成这项工作。

sed "/^$id/s/[$columnsep]*[^$columnsep]*/$columnsep$editvalue/$pos" "$file"

但是,我建议使用 awk 来完成这样的任务

awk -F "$columnsep" -v OFS="$columnsep" -v id="$id" -v editvalue="$editvalue" -v pos="$pos" '
  ($1==id){$pos=editvalue}1' "$file"

推荐阅读