【问题标题】:sed equivalent to PCRE's `.?`sed 相当于 PCRE 的`.?`
【发布时间】:2013-08-30 19:23:56
【问题描述】:

我正在尝试查找aaa 的所有实例并将其替换为bbb,但保留aaa 之前的第一个字符。下面是我在 PHP 中使用 PCRE 的方法:

preg_replace('#(.?)aaa#', '\1bbb', 'aaasdfg');

我将如何使用 sed 做类似的事情?这是我的尝试(没有成功):

sed -i.bak -r 's/(.\?)aaa/\1bbb/g' filename.ext

这是一个人为的例子。我正在尝试做的事情有点复杂,但长话短说,我正在努力让.? 工作。

有什么想法吗?

【问题讨论】:

  • aaa的第一个字符不是一直都是a吗?对于像我这样的慢人:也许您可以发布一些应该如何转换几个字符串的示例。
  • aaasdfg 被转换为bbbsdfgxaaasdf 被转换为 xbbbsdf。所以它不是 a 的第一个字符,而是 bbb 之前的任何字符。
  • 我不明白。这与sed -i.bak -r 's/aaa/bbb/g' filename.ext 有何不同?我的意思是,正则表达式替换总是保留匹配字符串之前的 everything ;你不需要为此做任何特别的事情。
  • 为什么首先使用 sed?你肯定在那台机器上有 perl 和 php。
  • 我刚才看错了你的问题。现在我更新了我的答案,我认为你的问题应该得到解决。你被逃跑弄糊涂了……;)

标签: php regex sed pcre


【解决方案1】:

刚才我误读了你的问题,我以为你想用 sed 做.*?。 ..

好的,现在我明白你的意思了。在您提出的另一个问题中,我提到,对于 BRE,您必须转义这些字符才能赋予它们特殊的含义。但是对于 ERE,您必须转义具有特殊含义的字符才能获取文字字符串。

你使用-r,让sed使用ERE,但是你转义了?,这意味着你想匹配文字字符串?

试试这个:

sed -i.bak -r 's/(.?)aaa/\1bbb/g' filename.ext

或者这个:

sed -i.bak 's/\(.\?\)aaa/\1bbb/g' filename.ext

测试:

默认为 BRE

kent$  echo "aaasdf
xaaasdf"|sed 's/\(.\?\)aaa/\1bbb/'
bbbsdf
xbbbsd

使用 -r,ERE:

kent$  echo "aaasdf
xaaasdf"|sed -r 's/(.?)aaa/\1bbb/' 
bbbsdf
xbbbsdf

【讨论】:

  • +1 用于弄清楚 OP 想要什么。我仍然不知道为什么s/aaa/bbb/ 不够用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
  • 2014-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-18
  • 2016-07-07
相关资源
最近更新 更多