Unix 如果前一行没有';不包含特定的字符串
我在文件中有以下行:Unix 如果前一行没有';不包含特定的字符串,unix,grep,Unix,Grep,我在文件中有以下行: abcdef ghi jkl uvw xyz 如果前一行不包含字符串“jkl”,我想grep字符串“xyz” 我知道如果行不包含特定的字符串,如何使用-v选项grep查找字符串。但我不知道如何使用不同的行来实现这一点。我认为最好使用实际的编程语言,即使是简单的编程语言,如Bash、AWK或sed。例如,使用Bash: ( previous_line_matched= while IFS= read -r line ; do if [[ ! "$previo
abcdef ghi jkl
uvw xyz
如果前一行不包含字符串“jkl”,我想grep字符串“xyz”
我知道如果行不包含特定的字符串,如何使用-v选项grep查找字符串。但我不知道如何使用不同的行来实现这一点。我认为最好使用实际的编程语言,即使是简单的编程语言,如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
)
(
前一行匹配=
当IFS=读取-r行时;执行
如果[[!“$previous_line_matched”&&&“$line”==*xyz*];则
回音“$line”
fi
如果[[“$line”==*jkl*];则
上一行匹配=1
其他的
前一行匹配=
fi
完成
或者,更简洁地说,使用Perl:
perl -ne 'print if m/xyz/ && ! $skip; $skip = m/jkl/' < input_file
perl-ne'如果m/xyz/&&打印$跳过$skip=m/jkl/'
grep
确实是一个面向行的工具。也许可以通过它实现您想要的,但使用Awk更容易:
awk '
/xyz/ && !skip { print }
{ skip = /jkl/ }
' file
读作:每一行,都要做
- 如果当前行与
匹配,并且我们没有看到xyz
,请打印它李>jkl
- 设置变量
以指示我们是否刚刚看到了skip
jkl
sed'/jkl/{N;d}/xyz/!d'
- 如果查找jkl,请删除该行,然后单击下一步
- 使用
xyz