多字正则表达式中的 sed 替换问题

多字正则表达式中的 sed 替换问题

举个简单的例子:

echo "20150310 21:12:01.846338::: <?xml version="1.0"?><Haystack><Event " \
| sed 's/^\(.\{24\}\)::: \(<?xml.*><Haystack\|Foo\)>\(.*\)/\2 ts=\"\1\">\3/'

将返回:

<?xml version=1.0?><Haystack ts="20150310 21:12:01.846338"><Event

本质上,我想获取该行的前 24 个字符,将它们作为根元素的 xml 属性插入,并替换 xml 的其余部分。这有效。

但如果我转置它Haystack\|FooFoo\|Haystack它只会返回原始字符串,找不到匹配项。实际上我有大约 7 个根元素需要寻找。

但这\|应该是您输入多个单词进行匹配的方式,例如:

echo "foo" | sed 's/foo\|bar/nobar/'

那么如何让 () 引用匹配以与上面相同的方式工作呢?

我使用的是 Fedora Linux,sed 版本 4.2.2。

另外,如果有人可以建议一个更有效的正则表达式,我将不胜感激。这是一个更大的问题集的一部分,其中包含我正在寻找的大约 7 个根 XML 表达式,并且需要它尽可能快地运行。

答案1

你的表情告诉你sed要匹配其中一个<?xml.*><Haystack 或者 Foo。正则表达式引擎使用捕获括号来告知将运算符向左或向右扩展多远or。 (如果您使用 PCRE 引擎,那么您可以使用非捕获括号。)


原始的有问题的代码:

echo "20150310 21:12:01.846338::: <?xml version="1.0"?><Haystack><Event " \
| sed 's/^\(.\{24\}\)::: \(<?xml.*><Haystack\|Foo\)>\(.*\)/\2 ts=\"\1\">\3/'

固定代码:

echo "20150310 21:12:01.846338::: <?xml version="1.0"?><Haystack><Event " \
| sed 's/^\(.\{24\}\)::: \(<?xml.*>\)<\(Haystack\|Foo\)>\(.*\)/\2<\3 ts=\"\1\">\4/'

相关内容