$1 不能与 sed 一起使用

$1 不能与 sed 一起使用

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

<h> PIDAT <h> O

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

<h>

为此我正在使用

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

但 sed 似乎无法识别$1. (据我了解,$1应该删除组中不包含的所有内容)。有什么方法可以实现这个目标吗?如果您能指出正确的方向,我将非常感激。

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

答案1

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

请注意,sed 正则表达式是贪婪的,因此<.*>将在该行中匹配<h> PIDAT <h>,而不是在第一个 处停止>。并且.*?没有意义(.*已经不能匹配任何内容,因此?没有必要将其设置为可选)。

这可能有效:

sed -i -Ee 's/^(<[^>]*>).*/\1/' *.conll

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

相关内容