举个简单的例子:
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\|Foo
,Foo\|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/'