我在Windows中使用Gitbash。我想grep一組字符串,每個字符串以|結尾Grep用於多個字符串,每個字符都帶有漏洞
我想我能做到每一個單獨用一個反斜槓逃脫管:
grep abcdef\| filename.tsv
但要做到他們在一起我結束了:
grep 'abcdef\|\|uvwxyz\|' filename.tsv
其失敗。有任何想法嗎?
我可以單獨做每個字符串,然後連接生成的文件,但這需要幾天時間。
我在Windows中使用Gitbash。我想grep一組字符串,每個字符串以|結尾Grep用於多個字符串,每個字符都帶有漏洞
我想我能做到每一個單獨用一個反斜槓逃脫管:
grep abcdef\| filename.tsv
但要做到他們在一起我結束了:
grep 'abcdef\|\|uvwxyz\|' filename.tsv
其失敗。有任何想法嗎?
我可以單獨做每個字符串,然後連接生成的文件,但這需要幾天時間。
在基本的posix正則表達式中 - grep使用的 - 你不能逃避文字|
。但是,如果用作正則表達式語法元素來指定備選項,則需要跳過|
。
下面的表達式應該工作:
grep 'abcdef|\|uvwxyz|' filename.tsv
謝謝,這是一種享受。 –
不客氣! – hek2mgl
的ERE可能會去,更容易可讀性的方式。
egrep '(abcdef|uvwxyz)[|]' filename.tsv
這可以讓你多一點輕鬆管理您的字符串列表,以及「越獄」,將其置於一個範圍內的尾隨豎線。 (這也適用於點,星號等。)
如果您的系統上沒有可用的egrep
,那麼可以檢查您現有的grep是否包含用於擴展正則表達式的-E
選項。
這裏有兩種相互競爭的效果,您可能會感到困惑。首先,必須轉義或引用|
,以使其不被shell解釋。其次,根據您使用的是哪種正則表達式模式,轉義/消除管道會更改它是文字字符還是元字符。
我建議你改變你的模式是:
grep 'abcdef|\|uvwxyz|' file
在基本的正則表達式模式,轉義管\|
是一個正則表達式OR,所以這個匹配或者模式之後文字管。
或者,如果你所有的模式在管端,你必須比短短兩年多,也許你可以這樣做:
grep -E '(abc|def|ghi)\|' file
在擴展模式下,逃避管有相反的效果,所以這種模式匹配字母管道後跟的任何字母序列。
OP可能有'egrep'命令,默認爲'-E'模式(它們通常是單獨的命令,但是這些日子更常見的是具有不同默認值的命令)。 –
@MarkReed事實上,GNU的'egrep'只是一個[shell腳本](http://git.savannah.gnu.org/cgit/grep.git/tree/src/egrep.sh),它調用'grep -E' 。然而,這意味着'grep -E'比'egrep'稍快 - 因爲它不需要產生額外的外殼。這就是爲什麼我更喜歡'grep -E' - 至少在shell腳本中。 – hek2mgl
請注意多個級別的報價。當你輸入'grep abcdef \ | filename.tsv',反斜槓使shell解釋管道,並嘗試將'grep abcdef'的輸出提供給命令'filename.tsv'。但是'grep'實際得到的第一個參數就是'abcdef |',沒有反斜槓 - 這就是你想要的基本'grep'正則表達式;從字面上理解未反斜槓的管道。將參數放入單引號時,現在反斜槓會傳遞給'grep',這會完全改變您要求的內容。 –