1

tempvarbashには、次のように作成された文字列変数があります。

tempvar=`grep -n 'Mesh Tally' ${meshtalfile}`

meshtalfileは(大きな)入力ファイルであり、いくつかのヘッダー行といくつかのデータ行のブロックが含まれています。各ブロックは、上記のgrepで検索される開始行でマークされています。

手元の場合、変数tempvarには次の文字列が含まれています。

5: Mesh Tally Number 4 977236: Mesh Tally Number 14 1954467: Mesh Tally Number 24 4354479: Mesh Tally Number 34

ここで、特にメッシュの集計番号に関連する行番号を抽出したいので、変数meshnum1をに等しいと定義し24、次のsedコマンドを実行します。

echo ${tempvar} | sed -r "s/^.*([0-9][0-9]*):\sMesh\sTally\sNumber\s${meshnum1}.*$/\1/"

これは物事がうまくいかないところです。出力を期待します1954467が、代わりに。を取得し7ます。代わりに数値で試してみると、の代わり34に戻ります。sedは数字の最後の桁だけを返しているようです-これは確かに欲張りマッチングの原則に違反していますか?そして奇妙なことに、開いた括弧を2、3文字残して移動すると、前に返していた1文字までの行全体が返されます。確かに、ある状況では貪欲になり、別の状況では反貪欲になることはできませんか?うまくいけば、私は構文で愚かなことをしたばかりです...94354479(.*

4

3 に答える 3

2

問題は、.*も貪欲であるということです。つまり、すべての数値も取得されます。[0-9][0-9]*パーツに少なくとも1桁の数字を入れるように強制するので、.*前は貪欲になり、後の式には1桁だけを残すことができます。

解決策は次のとおりです。

echo ${tempvar} | sed -r "s/^.*\s([0-9][0-9]*):\sMesh\sTally\sNumber\s${meshnum1}.*$/\1/"

ここで、との\s間は、一致させたい数字の前にスペースを明示的に強制します。.*[0-9][0-9]*

これがお役に立てば幸いです=)

于 2012-09-28T11:24:45.783 に答える
1

の必要はありませんsed、ここで使用する1つの方法がありますGNU grep

echo "$tempvar" | grep -oP "[0-9]+(?=:\sMesh\sTally\sNumber\s${meshnum1}\b)"
于 2012-09-28T11:51:32.647 に答える
1

$ tempvarの値は複数行ですか、それとも1行ですか?単一行の場合、「。* $」は行末に一致する必要があるため、他のすべての値も意味しますよね?

于 2012-09-28T11:24:52.397 に答える