テキストファイルから特定の行範囲を取得するためにgrepを使用しようとしています。行範囲は2つの変数で識別する必要があります。これまで、私はワイルドカード「*」を使ってこれをやってきました。失敗した試みの例は次のとおりです。 (最初の2つが機能しない理由がわかります。)
grep "$Var1"*"$Var2" file.txt
grep "$Var1*$Var2" file.txt
echo "$Var1*$Var2" | grep file.txt
答え1
grep
複数行検索では機能しません。この仕事に適した他のツールがあります:awk
とsed
。
パターンを維持するために変数を使用するので、状況は難しいかもしれません。まず、ハードコーディングモードを試してみてください。正しく設定したら、ハードコードされたパターンを変数に置き換えてください。
使用awk
:
awk '/'"$Var1"'/,/'"$Var2"'/' file.txt
ハードコーディングモードで同じコマンドを使用して概念を説明します。
awk '/pattern1/,/pattern2/' file.txt
説明する:
/pattern1/,/pattern2/
範囲です。範囲は一致する行で始まり、pattern1
一致する行で終わりますpattern2
。- デフォルトでは、
awk
範囲内の行のみが印刷されます。
以下の詳細をご覧くださいawk
。http://www.catonmat.net/blog/awk-one-liners-explained-part-one/
使用sed
:
sed -n '/'"$Var1"'/,/'"$Var2"'/ p' file.txt
ハードコーディングモードで同じコマンドを使用して概念を説明します。
sed -n '/pattern1/,/pattern2/ p' file.txt
説明する:
-n
そうするように指示された場合は、sedに行のみを印刷してください。/pattern1/,/pattern2/
範囲です。範囲は一致する行で始まり、pattern1
一致する行で終わりますpattern2
。範囲の各行に対して、次のコマンドが実行されます。- 最後は印刷ラインを
p
教えてくれます。sed
以下の詳細をご覧くださいsed
。http://www.catonmat.net/blog/sed-one-liners-explained-part-one/
使用する必要がある場合は、Tellを使用してPerl正規表現エンジンを使用grep
できます。マニュアルページにはこの機能の説明があります。-P
grep
パターンをPerl互換正規表現(PCRE)として解釈します。これは非常に実験的であり、grep -Pは実装されていない機能について警告することができます。