段落で構成されたファイル()がありますmyfile
。つまり、項目は空行で区切られます。に基づいてこれらの段落のいくつかを検索したいと思いますmatch
。
今ゲームが1つだけであれば、すべてが面白くてゲームになります。私はただこうしていますawk -v RS='' '/match/ {print}' myfile
。ここ。問題は、何百もの一致が見つかり、file
それを別のファイル()に収集したことですmatchfile
。一致する行のみを検索する必要がある場合grep -f matchfile myfile
。
grep -f
段落全体を検索するなどの操作を実行する方法はありますか?私の好みのUnixはそれをサポートしていませんgrep -p
。
ベストアンサー1
段落を1行に置き換え、grep -f matchfile
結果を使用して改行を復元できます。
sed '/^$/s/^/\x02/' myfile | tr \\n$'\002' $'\003'\\n \
| grep -f matchfile | tr $'\003' \\n | head -n -1
head
出力に続く空行が問題にならない場合は、省略できます。
したがって、...各空白行の先頭にsed
追加し、すべての改行を改行に変換します(元の行がいくつかの低いASCII文字で区切られたフィールドである単一行に効果的にすべての段落を変換します。これはテキストファイルで発生しますしません)。 - この場合)一致する項目のみを選択してください。\x02
tr
\x03
\x02
\x03
grep
「ワイヤー」;最後に、2番目はtr
改行を復元し、次のhead
空白行を削除します(たとえば、他のツールを使用できますsed \$d
)。
実際にどのように動作するかを理解する最も簡単な方法は、段階的に実行することです。最初のコマンドを実行してから、最初と2番目のコマンドなどを実行し、出力を見てください。説明が必要です1。
tr
1:マニュアルを読んで慣れたら…