3

pcregrep -M複数行の文字列を検索するために使用しようとしています。

これは私のスクリプトの行です:

lineNumber=$(pcregrep -Mn '$firstLine.*\n.*$secondLine.*' $myFile)

myFile次の形式の複数の行が含まれています。

firstLine\n  
secondLine(with other characters here that I don't need to match)

空の文字列を取得し、lineNumberそれだけです。

私は何を間違っていますか?

戻り値には何が期待できますか? -n行番号を教えてはいけませんか?もしそうなら、最初と2番目のどちらの行番号ですか?

awk代わりにorを使用する必要がsedありますか?

4

1 に答える 1

2

まず、有効な正規表現が必要です。あなたが求めていることを正しく理解していれば、これはうまくいきます:

pcregrep -Mn '^firstLine.*\n^secondLine'  myFile

これは単なる行番号以上のものを出力することに注意してください。pcregrepman ページに従って、一致する行も出力します。

開始行番号だけを印刷したい場合は、次を試してください。

sed -n '/^firstLine/=' myFile

正規表現/^firstLine/は最初の行を選択し、コマンドは行番号を出力するように=指示します。sed

最後の行番号だけを印刷するには:

sed -n '/^secondLine/=' myFile

両方とその間の任意の行を取得するには:

sed -n '/^firstLine/,/^secondLine/=' myFile

awkも使用できます。ライン選択も同様です。行番号を出力するコマンドが異なります。例えば:

awk '/^firstLine/ {print NR}' myFile

行番号を変数に取り込む

コマンド置換を使用して、行番号を変数に取り込むことができます。

lineNumber=$(awk '/^firstLine/ {print NR}' myFile)

ただし、行番号が 2 つ以上ある場合は、役に立たない可能性があります。その場合、 などの配列をサポートするシェルを使用している場合は、bash次のように行番号を配列にキャプチャすることをお勧めします。

lineNumbers=($(awk '/^firstLine/ {print NR}' myFile))

echo $lineNumbers配列に慣れていない場合は、 などのステートメントでは配列全体が表示されず、最初の要素のみが表示されることに注意してください。配列全体を表示するには、次を実行します。

declare -p lineNumbers
于 2014-07-02T02:02:58.943 に答える