![用 sed 替换几个正则表达式组](https://linux22.com/image/172717/%E7%94%A8%20sed%20%E6%9B%BF%E6%8D%A2%E5%87%A0%E4%B8%AA%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E7%BB%84.png)
我想在出现以下任一情况后添加一个空格:
<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 引擎的实现,它将
- 像在 BSD 上一样报告错误
- 与 GNU 系统上的相同
.*
(就像)(.*)?
- 与 ast-open 一起工作 like
perl
的*?
非贪婪版本*
sed
- 做任何事情或所有事情,因为它不是标准操作员
你似乎想要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