$1 不适用于 sed

Car*_*nas 6 xml sed regular-expression

我有一堆包含 XML 标签的文件,例如:

<h> PIDAT <h> O

我需要删除<h>该行中第一个之后的所有内容,以便我可以得到:

<h>

为此,我正在使用

sed -i -e 's/(^<.*?>).+/$1/' *.conll

但似乎 sed 无法识别$1. (据我所知,$1应该删除组中未包含的所有内容)。有没有办法实现这一目标?如果您能指出我正确的方向,我将不胜感激。

PS:我在正则表达式应用程序上测试了这些表达式并且它们起作用了,但它在命令行中不起作用。

mur*_*uru 11

sed反向引用具有, 等形式\1,更像 Perl。此外,如果使用基本正则表达式 (BRE),您需要转义形成组的括号,以及和。或者,您可以使用带有选项的扩展正则表达式。\2$1(...)?+-E

请注意, sed 正则表达式是贪婪的,因此<.*><h> PIDAT <h>在该行中匹配,而不是在第一个>. 并且.*?没有意义(.*已经不能匹配任何东西,因此?不需要通过它成为可选)。

这可能有效:

sed -i -Ee 's/^(<[^>]*>).*/\1/' *.conll
Run Code Online (Sandbox Code Playgroud)

[^>]匹配除 之外的所有内容>,因此<[^>]*>将匹配<h>但不匹配<h> PIDAT <h>