将正则表达式积极展望转换为 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
我想用 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