用 sed 替换几个正则表达式组

用 sed 替换几个正则表达式组

我想在出现以下任一情况后添加一个空格:

<span class="negrita">ANYTHING</span>

因此,使用此 SED 指令:

sed -E "s/(<span class=\"negrita\">.*?<\/span>)/\1 /g" <<< 'In <span class="negrita">1959</span> economic policy was reoriented in order to undertake <span class="negrita">the country modernization</span>. More text'

我得到这个输出:

In <span class="negrita">1959</span> economic policy was reoriented in order to undertake <span class="negrita">the country modernization</span> . More text

因此,正如您所看到的,它是在最后一次出现之后添加空格,而不是在第一次出现之后添加空格。 “/g”选项不是意味着它应该替换所有出现的情况吗?

提前致谢。

答案1

*?不是标准的扩展正则表达式运算符。

根据sed或 regexp 引擎的实现,它将

  1. 像在 BSD 上一样报告错误
  2. 与 GNU 系统上的相同.*(就像)(.*)?
  3. 与 ast-open 一起工作 likeperl*?非贪婪版本*sed
  4. 做任何事情或所有事情,因为它不是标准操作员

你似乎想要3,但你正在得到2,可能因为你sed是 GNU sed

请注意,这也不-E是标准sed选项(尽管可能会出现在 POSIX 规范的下一个主要版本中)。

如果你想使用perl正则表达式运算符,你应该使用perl

perl -pe 's:<span class="negrita">.*?</span>:$& :g'

(假设跨度s 不嵌套也不分割成几行)

或者使用sed,您可以执行以下操作(假设跨度的内容不包含任何<):

sed 's:<span class="negrita">[^<]*</span>:& :g'

答案2

尝试

sed -E "s/(<span class=\"negrita\">[^<]*?<\/span>)/\1 /g" 

在哪里

  • [^<]表示任何字符,但<

使用您的示例(添加了===

sed -E "s/(<span class=\"negrita\">[^<]*?<\/span>)/\1=== /g"

给出(手动折叠)

In <span class="negrita">1959</span>===  economic policy 
was reoriented in order to undertake <span class="negrita">the 
country modernization</span>=== . More text

相关内容