将regex的第N个匹配替换为sed

时间:2018-11-11 13:02:28

标签: regex sed replace

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

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

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

这是我现在想出的:

  • 找到正则表达式[$columnsep]*[a-zA-Z0-9./\-:+]+

  • 的第N个匹配项
  • 以给定$id

  • 开头的行中
  • $columnsep$editvalue替换出现的情况

因此适当的sed命令为:

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

我得到[a- ...": invalid command code [,尽管它可以与https://regexr.com/之类的在线正则表达式测试器一起使用

1 个答案:

答案 0 :(得分:1)

除非$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"