1

我在文件中有以下几行:

abcdef ghi jkl
uvw xyz

如果上一行不包含字符串“jkl”,我想 grep 字符串“xyz”。

如果该行不包含使用 -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 回答
1
sed '/jkl/{N;d}; /xyz/!d'
  • 如果找到jkl,请删除该行并下一个
  • 仅打印剩余的行xyz
于 2013-06-21T05:27:29.153 回答
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 回答