我需要排除選定的字串。我正在嘗試使用grep -v選項。
輸入:
AM2RGHK
AM2RGHK-JO
AM2RGHK-FN
輸出應該是:
AM2RGHK-JO
AM2RGHK-FN
從輸入串列中,如果我只想排除第一行,我正在使用grep -v AM2RGHK
但我沒有得到任何輸出。grep -v排除同一序列中的所有字串。有什么線索嗎?
uj5u.com熱心網友回復:
grep -v '^AM2RGHK$' input.txt
輸入.txt:
AM2RGHK
AM2RGHK-JO
AM2RGHK-FN
標準輸出:
AM2RGHK-JO
AM2RGHK-FN
uj5u.com熱心網友回復:
grep匹配所有輸入行,因為它的默認行為是匹配包含給定模式的行。它不必完全等于它。
-x您可以使用選項( --line-regexp)告訴 grep 它必須找到完全匹配。
grep -v -x AM2RGHK做你想做的事。
旁注:
由于您似乎沒有使用實際的正則運算式,但您只需要簡單的文本匹配,您可以考慮選項-F( --fixed-strings)。它告訴grep不要給模式中的任何字符賦予特殊含義。
此外,將 shell 字串包含在''. 這確保了 shell 不會嘗試解釋任何字符,例如空格。它可以讓你省去很多麻煩。
結果命令將是:
grep -vxF 'AM2RGHK'
uj5u.com熱心網友回復:
考慮一下您可以控制什么,在這種情況下,您可以與有問題的字串進行比較,但我們可以在每端添加一個填充字符并查找它,而不僅僅是字串。
#!/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
注意:有更簡潔的方法可以做到這一點,但這也是一個好方法。
uj5u.com熱心網友回復:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/464558.html
