2

次のテキストがあるとします。

name is test1 and age is test2 end
name is test3 and age is test4 end
name is test5 and age is test6 end
name is test7 and age is test8 end

次のように、test1、test2、...をgrepしています:

-bash$ grep -o -P "is .*? and|is .*? end" test
is test1 and
is test2 end
is test3 and
is test4 end
is test5 and
is test6 end
is test7 and
is test8 end

一致したパターンの前にテキストを追加する方法はありますか? 次のような出力を探しています。

STRING1:is test1 and
STRING2:is test2 end
STRING1:is test3 and
STRING2:is test4 end
STRING1:is test5 and
STRING2:is test6 end
STRING1:is test7 and
STRING2:is test8 end
4

3 に答える 3

3

パイプラインで使用できますsed(確かに、あまりきれいではありません)。

$ grep -o -P "is .*? and|is .*? end" test | sed '/and$/s/^/STRING1:/; /end$/s/^/STRING2:/'
STRING1:is test1 and
STRING2:is test2 end
STRING1:is test3 and
STRING2:is test4 end
STRING1:is test5 and
STRING2:is test6 end
STRING1:is test7 and
STRING2:is test8 end

/.nd$/各置換の前に、置換がその正規表現に一致する行に作用するように制限します。

于 2012-05-06T07:58:28.697 に答える
3

あなたのニーズを満たすために、grepの出力をawkにパイプします:

grep -o -P "is .*? and|is .*? end" test | \
awk -v a=STRING1: -v b=STRING2: "/and$/ {print a\$0} /end$/ {print b\$0}"
于 2012-05-06T08:07:55.100 に答える
0

テキストを選択するだけでなく操作したいsedので、 よりも優れたツールになりgrepます。

必要な置換を実行する正規表現を作成するのは簡単です。2 つの置換があるため、2 つの式 ( ) を使用できます-e。一致する行のみを操作するには (grep の例のように)、アクションを使用sed -nして、一致する行のみを出力します。p注意が必要なのは、同じ行を複数回操作したい場合ですが、最初の置換を実行すると、2 番目の置換で残りの文字列が失われることです。たとえば、次は希望に近いものですが、最初の式は 2 番目の式が一致する文字列を削除するため、2 番目の式は一致しません。

sed -n -e 's/.*\(is .* and\).*/STRING1:\1/p' -e 's/.*\(is .* end\)/STRING2:\1/p'
STRING1:is test1 and
STRING1:is test3 and
STRING1:is test5 and
STRING1:is test7 and

この問題を回避するには、hおよびgsed コマンドを使用して、パターン スペース (入力行) をホールド バッファーにコピーし ( h)、次の sed コマンドのパターン スペースにコピーして戻します ( g)。

sed -n -e 'h;s/.*\(is .* and\).*/STRING1:\1/p' -e 'g;s/.*\(is .* end\)/STRING2:\1/p'
STRING1:is test1 and
STRING2:is test2 end
STRING1:is test3 and
STRING2:is test4 end
STRING1:is test5 and
STRING2:is test6 end
STRING1:is test7 and
STRING2:is test8 end

最初の式の置換が実行される前に、行はホールド バッファーに保存されます。2 番目の式は、最初にホールド バッファーを使用してパターン バッファーをロードし、2 番目の置換が機能するようにします。

これら 2 つの別々の式を 1 つに結合することもできますが、それでは読みにくくなると思います。

sed -n -e 'h;s/.*\(is .* and\).*/STRING1:\1/p;g;s/.*\(is .* end\).*/STRING2:\1/p'
于 2012-05-06T12:31:29.477 に答える