gpt4 book ai didi

regex - sed 和 Perl 正则表达式替换一次,带有多个替换标志

转载 作者:行者123 更新时间:2023-12-05 01:06:17 34 4
gpt4 key购买 nike

我有字符串:

lopy,lopy1,sym,lopy,lopy1,sym"

我希望这条线是:

lopy,lopy1,sym,lady,lady1,sym

这意味着字符串 sym 之后的所有“lad”都应该被替换。于是我跑了:

echo "lopy,lopy1,sym,lopy,lopy1,sym" | sed -r 's/(.*sym.*?)lopy/\1lad/g'

我明白了:

lopy,lopy1,sym,lopy,lad1,sym

使用 Perl 并不是更好:

echo "lopy,lopy1,sym,lopy,lopy1,sym" | perl -pe 's/(.*sym.+?)lopy/${1}lad/g'

产量

lopy,lopy1,sym,lad,lopy1,sym

并不是所有的“lopy”都被替换了。我做错了什么?

最佳答案

(.*sym.*?)lopy/(.*sym.+?)lopy 模式几乎相同,.+? 匹配除换行符之外的一个或多个字符,但尽可能少,并且 .*? 匹配零个或多个这样的字符。注意 sed 不支持惰性量词,*?sed 中的 * 相同。但是,您使用的正则表达式的主要问题是它们匹配 sym,然后是它之后的任何文本,然后是 lopy,所以当您添加 g,它只是意味着你想在 sym....lopy 之后找到更多的 lopy 案例。而且您的字符串中只有一次这样的事件。

你想替换sym之后的所有lopy,这样就可以使用

perl -pe 's/(?:\G(?!^)|sym).*?\Klopy/lad/g'

regex demo . 详情:

  • (?:\G(?!^)|sym) - sym 或上一个匹配的结束 (\G(?!^))
  • .*? - 除换行符以外的任何零个或多个字符,尽可能少
  • \K - 匹配重置运算符,丢弃到目前为止匹配的所有文本
  • lopy - lopy 字符串。

查看在线演示:

#!/bin/bash
echo "lopy,lopy1,sym,lopy,lopy1,sym" | perl -pe 's/(?:\G(?!^)|sym).*?\Klopy/lad/g'
# => lopy,lopy1,sym,lad,lad1,sym

如果值总是以逗号分隔,您可以将 .*? 替换为 ,:(?:\G(?!^)|sym) ,\Klopy(参见 this regex demo)。

关于regex - sed 和 Perl 正则表达式替换一次,带有多个替换标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69431960/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com