使用grep -v排除字符串



我需要排除一个选定的字符串。我正在尝试使用grep -v选项。

输入:

AM2RGHK
AM2RGHK-JO
AM2RGHK-FN

输出应该是:

AM2RGHK-JO
AM2RGHK-FN

从输入列表中,如果我想只排除第一行,我使用grep -v AM2RGHK但是我没有得到任何输出。grep -v排除同一序列中的所有字符串。有线索吗?

grep匹配所有输入行,因为它的默认行为是匹配包含给定模式的行。不需要完全相等

你可以使用选项-x(--line-regexp)告诉grep它必须找到一个精确的匹配。

grep -v -x AM2RGHK做你想做的。


指出:

由于您似乎不使用实际的正则表达式,但您只需要简单的文本匹配,您可以考虑选项-F(--fixed-strings)。它告诉grep不要给模式中的任何字符赋予特殊含义。

此外,将shell字符串封装在''中总是一个很好的做法。这确保了shell不会尝试解释任何字符,比如空格。它可以为你省去很多麻烦。

结果命令将是:

grep -vxF 'AM2RGHK'
grep -v '^AM2RGHK$' input.txt

input.txt:

AM2RGHK
AM2RGHK-JO
AM2RGHK-FN

标准输出:

AM2RGHK-JO
AM2RGHK-FN

想想你可以控制什么,在这种情况下,你可以比较问题字符串,但我们可以在字符串的两端添加一个pad字符,并查找它。

#!/bin/bash
read_file="/tmp/list.txt"
exclude="AM2RGHK"
while IFS= read -r line ;do
if ! [[ "Z${line}Z" = "Z${exclude}Z" ]] ;then
echo "$line"
fi
done < "${read_file}"

在这种情况下,我们说如果ZAM2RGHKZ != current则打印它,比较将如下所示:

ZAM2RGHKZ  = ZAM2RGHKZ  do nothing
ZAM2RGHKZ != ZAM2RGHK-JOZ print because they don't match
ZAM2RGHKZ != ZAM2RGHK-FNZ print because they don't match

因此输出变成:

AM2RGHK-JO
AM2RGHK-FN

注意:有更简洁的方法来做到这一点,但这也是一个好方法。

grep有选项-x

-x, --line-regexp
Select only those matches that exactly match the whole line.  (-x is specified by POSIX.)

例如:

[dachnik@test]$ cat > greptest
AM2RGHK
AM2RGHK-JO
AM2RGHK-FN[dachnik@test]$ cat greptest
AM2RGHK
AM2RGHK-JO
AM2RGHK-FN[dachnik@test]$ grep -v -x AM2RGHK greptest
AM2RGHK-JO
AM2RGHK-FN

相关内容

  • 没有找到相关文章

最新更新