我需要排除一个选定的字符串。我正在尝试使用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