簡単な例を見てください:
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/'