我在文件中有以下几行:
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