0

ファイルから 2 つの一致するパターンの間で項目を grep するために使用する必要があるコマンドはどれですか。私のファイルには次のような行があります:

abc def ghi
abc bcd def (task Name: example)
##some other similar lines##

Name: と ')' の間のデータが必要です

コマンドで試しました

cat script.log | sed 's/Name:\(.*\)\)/\1/gp'

このコマンドでは、必要な結果が得られません。これで私を導いてください。

また、「Name:」の代わりに $Name を使用することは可能ですか (元の値を置き換える変数を使用)

4

3 に答える 3

1

近くにいるあなた、試してみてください

echo "abc bcd def (task Name: example)" | sed 's/.*Name: \(.*\)[\)]/\1/'

**output**
example

またはさらに簡単

echo "abc bcd def (task Name: example)" | sed 's/.*Name: \(.*\))/\1/'

文字通りのクロージングパレン')'をエスケープする必要がないことに注意してください。

または(リクエストごと)、変数を使用

var="Name: "
echo "abc bcd def (task Name: example)" | sed "s/.\*${var}\(.\*\))/\1/"

出力

example

シェルのメタ文字「*」の前後に余分なエスケープ文字があることに注意してください。

の値にvar=シェルメタ文字が含まれている場合は、それらもエスケープする必要があります。

IHTH

于 2012-12-06T22:45:35.327 に答える
1

GNU grep を使用

grep -oP '(?<=Name: )\w+(?=\))' script.log
于 2012-12-06T22:49:58.433 に答える
0

何かのようなもの:

cat script.log | sed -n '/Name:/s/^.*Name:\([^)]*\)).*$/\1/gp'

仕事をする必要があります。

元の表現での最大の間違いは、2番目の括弧をエスケープしたことです。スニペットを実行すると、エラーが発生します。

sed: 1: "s/Name:\(.*\)\)/\1/g": RE error: parentheses not balanced

これを修正しても、sedはデフォルトですべての行を出力することがわかります。これが私が作り上げた表現がすることです。

sed式は。の形式を取り[address[,address]]function[arguments]ます。式にオプションのアドレス要素が含まれていませんでした。「Name:」を含むすべての行に一致する単一のアドレス( )を含めました。/Name:/この関数は、(1)検索パターンと(2)置換式の2つの引数を必要とする置換関数です。検索パターンは行全体に一致し、最初の括弧まで0個以上の文字を含む「Name:」に続く行のセグメントを抽出します。「エスケープされた」括弧はキャプチャグループを定義し、エスケープされていない括弧はキャプチャを終了します。パターンには、残りの行が含まれます(たとえば、.*$)。行全体が一致するため、キャプチャされた部分のみを含む置換式に置き換えられます。

これをすべてまとめると、単純なsedステートメントは「Name:」を含むすべての行に一致し、行全体をとの間の文字Name:と最初の左括弧())に置き換えます。フラグとフラグの-n追加によりp、一致した行のみが印刷されます。

于 2012-12-06T22:43:01.583 に答える