ファイルに次の行があります。
abcdef ghi jkl
uvw xyz
前の行に文字列「jkl」が含まれていない場合、文字列「xyz」をgrepしたい。
-v オプションを使用して行に特定の文字列が含まれていない場合、文字列を grep する方法を知っています。しかし、これを別の行で行う方法がわかりません。
grep
は実際にはライン指向のツールです。それを使用して目的を達成することは可能かもしれませんが、Awk を使用する方が簡単です。
awk '
/xyz/ && !skip { print }
{ skip = /jkl/ }
' file
次のように読みます: すべての行に対して、
xyz
し、まだ見ていない場合はjkl
、それを出力します。skip
を設定して、今見たばかりかどうかを示しますjkl
。Bash、AWK、sed などの単純な言語であっても、実際のプログラミング言語を使用した方がよいと思います。たとえば、Bash を使用すると、次のようになります。
(
previous_line_matched=
while IFS= read -r line ; do
if [[ ! "$previous_line_matched" && "$line" == *xyz* ]] ; then
echo "$line"
fi
if [[ "$line" == *jkl* ]] ; then
previous_line_matched=1
else
previous_line_matched=
fi
done < input_file
)
または、より簡潔に言えば、Perl を使用して:
perl -ne 'print if m/xyz/ && ! $skip; $skip = m/jkl/' < input_file