1

ファイルに次の行があります。

abcdef ghi jkl
uvw xyz

前の行に文字列「jkl」が含まれていない場合、文字列「xyz」をgrepしたい。

-v オプションを使用して行に特定の文字列が含まれていない場合、文字列を grep する方法を知っています。しかし、これを別の行で行う方法がわかりません。

4

3 に答える 3

2

grepは実際にはライン指向のツールです。それを使用して目的を達成することは可能かもしれませんが、Awk を使用する方が簡単です。

awk '
  /xyz/ && !skip { print }
                 { skip = /jkl/ }
' file

次のように読みます: すべての行に対して、

  • 現在の行が一致xyzし、まだ見ていない場合はjkl、それを出力します。
  • 変数skipを設定して、今見たばかりかどうかを示しますjkl
于 2013-06-21T05:26:14.400 に答える
0

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
于 2013-06-21T05:25:58.347 に答える