繁体   English   中英

如果前一行不包含特定字符串,则grep为一行中的字符串

[英]grep for a string in a line if the previous line doesn't contain a specific string

我在文件中有以下行:

abcdef ghi jkl
uvw xyz

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

我知道如果使用-v选项的行不包含特定字符串,如何grep一个字符串。 但我不知道如何用不同的线条做到这一点。

grep实际上是一个面向行的工具。 有可能用它来实现你想要的东西,但是使用Awk更容易:

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

读作:对于每一行,做

  • 如果当前行与xyz匹配并且我们还没有看到jkl ,则打印它;
  • 设置变量skip以指示我们是否刚刚看到jkl
sed '/jkl/{N;d}; /xyz/!d'
  • 如果找到jkl ,则删除该行,然后删除
  • 仅使用xyz打印剩余的行

我认为你最好使用一种实际的编程语言,即使是像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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM