検索パターンを探したいが、一意の一致が 1 つしかない場合にのみ成功し、一致する行を出力します。 2行が一致すると、grepは失敗したり何も印刷しません。
ベストアンサー1
ではこれを行うことはできませんが、grep
単に一致するアイテムの数を数えることができます。どのシェルを使用しているのか、どのOSを使用しているのかはわかりませんが、grep
以下はこれを実行できるbash関数の例です。
maxOne() (
pattern="$1"
file="$2"
IFS=$'\n'
set -f
results=( $(grep -m2 -- "$pattern" "$file") )
if [ "${#results[@]}" -eq 1 ]; then
printf -- '%s\n' "${results[@]}"
return 0
else
return 1
fi
)
次の行をファイルに追加するか、~/.bashrc
実行中のbashセッションの端末に貼り付けると、次のことができます。
maxOne foo file
foo
で検索するにはfile
。-m
ここで使用されているオプション(最大結果)は、2つのgrep
ゲームの後に終了する効率のためのものであり、すべてのバージョンでサポートされていないため、grep
エラーが発生した場合は単に削除してください。これは必須ではなく、作業を高速化するだけです。
重要: 複数行検索文字列では機能しません。サポートしgrep -z
ている場合は、複数行の検索文字列を使用できますgrep
。複数行の検索パターンを処理できる必要がある場合は、他のアプローチが必要です。また、これは空行に一致するパターン(たとえばgrep '^$' file
)では機能しません。ステファンのソリューション空行は処理されるので、これが問題であれば、これはより良い選択になります。私とは異なり、彼は複数のファイルを処理することができますが、これは良いボーナスです。