将正则表达式积极展望转换为 sed 操作

Convert regex positive look ahead to sed operation

我想用 sed 查找并用 _ 替换每次出现的 -,但仅在每一行第一次出现 = 之前。

这是一个可以使用的数据集:

ke-y_0-1="foo"
key_two="bar"
key_03-three="baz-jazz-mazz"
key-="rax_foo"
key-05-five="craz-"

最后数据集应该是这样的:

ke_y_0_1="foo"
key_two="bar"
key_03_three="baz-jazz-mazz"
key_="rax_foo"
key_05_five="craz-"

我发现这个正则表达式可以正确匹配。

\-(?=.*=)

然而,正则表达式使用正前瞻并且 sed(即使使用 -E-e-r)似乎不知道如何使用正前瞻.

我尝试了以下方法,但一直收到 Invalid preceding regular expression

cat dataset.txt | sed -r "s/-(?=.*=)/_/g"

是否可以使用 sed 以可用的方式转换它?

注意,我不想使用 perl。但是我对 awk 持开放态度。

您可以使用

sed ':a;s/^\([^=]*\)-/_/;ta' file

参见 online demo:

#!/bin/bash
s='ke-y_0-1="foo"
key_two="bar"
key_03-three="baz-jazz-mazz"
key-="rax_foo"
key-05-five="craz-"'
sed ':a; s/^\([^=]*\)-/_/;ta' <<< "$s"

输出:

ke_y_0_1="foo"
key_two="bar"
key_03_three="baz-jazz-mazz"
key_="rax_foo"
key_05_five="craz-"

详情:

  • :a - 设置一个名为 a
  • 的标签
  • s/^\([^=]*\)-/_/ - 从字符串的开头查找除 = 字符以外的任何零个或多个字符(同时捕获到第 1 组 (</code>)),然后匹配 <code>- 字符,并替换为组 1 值 (</code>) 和 <code>_(替换找到的 - 字符)
  • ta - 成功替换后跳转到标签 a 位置。否则,停止。

您也可以使用 awk 将字段分隔符设置为 =,并将第一个字段的所有 - 替换为 _

仅打印被替换的行:

awk 'BEGIN{FS=OFS="="}gsub("-", "_", )' file

输出

ke_y_0_1="foo"
key_03_three="baz-jazz-mazz"
key_="rax_foo"
key_05_five="craz-"

如果要打印所有行:

awk 'BEGIN{FS=OFS="="}{gsub("-", "_", );print}' file