我有一堆包含 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>
。