特定のパターン(他の2つの文字列の間に表示される文字列)に一致するファイルのリストを印刷する必要があります。どうすればいいですか?テキストを抽出したくなく、このパターンに一致するファイルだけをリストしたいと思います。
PREFETCH
advanced_override.begin
2つの文字列の間に表示される文字列のインスタンスを含むすべてのファイル名を一致させ、一覧表示するコマンドが必要ですadvanced_override.end
。これらのファイルはすべて同じディレクトリに存在するため、このコマンドは現在のディレクトリ「.」の内容を検索し、指定されたパターンと一致するファイル名を一覧表示する必要があります。
修正する:
次の内容が必要ですadvanced_override.begin <lots of text> PREFTECH <lots of other text> advanced_override.end
。これら2つの文字列間の特定の文字列を一致させるには、この文字列が必要で、おそらく前後の他の多くのテキストも一致する必要がありますPREFETCH
。
アップデート2:
入力ファイルはXMLファイルです。advanced_override.begin
で始まるセクションは、advanced_override.end
多くのテキスト行を含めて大きくすることができます。
答え1
pcregrep
可能であれば、-l
スイッチを使用して一致するファイル名のみを一覧表示できます。
pcregrep -lM '(?s)advanced_override\.begin.*PREFETCH.*advanced_override\.end' ./*
PREFETCH
複数行モードで中間の2つの文字列を検索します。現在のディレクトリにテキストファイルのみがあると仮定し(そうでない場合はループまたはをfor
使用できます)、各ファイルには次から始めて終わるfind
セクションが含まれているとします。複数のセクションでは、否定的な予測を使用することをお勧めします。たとえば、次のようになります。advanced_override.begin
advanced_override.end
PREFETCH
pcregrep -lM '(?s)advanced_override\.begin(?:(?!advanced_override\.end).)*PREFETCH.*advanced_override\.end' ./*
答え2
上記の警告は、ここそしてここしかし、特にここ正規表現を使用してXMLファイルを解析することに多くの関心がありました。通常、XMLテキストは1行に限定されないかもしれませんが、この場合、特定の単一の単語を検索し、その単語自体が複数の行に分割されないと仮定すると、単純なawkスクリプトを使用して「状態」。次の予測語が表示されると、state
値が増加します。予想されるすべてのパターンが正しい順序で見つかったら、found
変数を設定し、その変数に基づいて戻りコードを生成します。
#!/bin/sh
for f in *
do
awk '
/advanced_override\.begin/ { state=1; }
/PREFETCH/ && state == 1 { state=2; }
/advanced_override\.end/ && state == 2 { found=1; }
END {
if (found)
exit 0
else
exit 1
}
' "$f" && printf "Found in: %s\n" "$f"
done
次の3つの入力ファイルの例があります。
$ cat input1
junk
advanced_override.begin other text
other text
PREFETCH other text
other text
advanced_override.end
$ cat input2
just some stuff
advanced_override.end
$ cat input3
junk
advanced_override.begin other text other text PREFETCH other text other text advanced_override.end
junk
このスクリプトを実行すると、次のようになります。
Found in: input1
Found in: input3