2015-06-18 48 views
1

我在Windows中使用Gitbash。我想grep一組字符串,每個字符串以|結尾Grep用於多個字符串,每個字符都帶有漏洞

我想我能做到每一個單獨用一個反斜槓逃脫管:

grep abcdef\| filename.tsv 

但要做到他們在一起我結束了:

grep 'abcdef\|\|uvwxyz\|' filename.tsv 

其失敗。有任何想法嗎?

我可以單獨做每個字符串,然後連接生成的文件,但這需要幾天時間。

+1

請注意多個級別的報價。當你輸入'grep abcdef \ | filename.tsv',反斜槓使shell解釋管道,並嘗試將'grep abcdef'的輸出提供給命令'filename.tsv'。但是'grep'實際得到的第一個參數就是'abcdef |',沒有反斜槓 - 這就是你想要的基本'grep'正則表達式;從字面上理解未反斜槓的管道。將參數放入單引號時,現在反斜槓會傳遞給'grep',這會完全改變您要求的內容。 –

回答

2

在基本的posix正則表達式中 - grep使用的 - 你不能逃避文字|。但是,如果用作正則表達式語法元素來指定備選項,則需要跳過|

下面的表達式應該工作:

grep 'abcdef|\|uvwxyz|' filename.tsv 
+0

謝謝,這是一種享受。 –

+0

不客氣! – hek2mgl

4

的ERE可能會去,更容易可讀性的方式。

egrep '(abcdef|uvwxyz)[|]' filename.tsv 

這可以讓你多一點輕鬆管理您的字符串列表,以及「越獄」,將其置於一個範圍內的尾隨豎線。 (這也適用於點,星號等。)

如果您的系統上沒有可用的egrep,那麼可以檢查您現有的grep是否包含用於擴展正則表達式的-E選項。

+0

看起來比我建議的基本posix正則表達式更好!你說得對,egrep應該在這裏使用。 – hek2mgl

+0

'egrep'已棄用(使用'grep -E')。如果你使用'egrep'的動機是爲了保存一個字符,我建議使用'\ |'而不是'[|]':) –

+1

@TomFenech,我定期看到有人提到egrep已被棄用,但我已經在我使用的任何系統文檔中都沒有提到過。關於酒吧,我經常使用範圍來逃避特殊字符,因爲它們在BRE和ERE中以相同的方式工作。 – ghoti

2

這裏有兩種相互競爭的效果,您可能會感到困惑。首先,必須轉義或引用|,以使其不被shell解釋。其次,根據您使用的是哪種正則表達式模式,轉義/消除管道會更改它是文字字符還是元字符。

我建議你改變你的模式是:

grep 'abcdef|\|uvwxyz|' file 

在基本的正則表達式模式,轉義管\|是一個正則表達式OR,所以這個匹配或者模式之後文字管。

或者,如果你所有的模式在管端,你必須比短短兩年多,也許你可以這樣做:

grep -E '(abc|def|ghi)\|' file 

在擴展模式下,逃避管有相反的效果,所以這種模式匹配字母管道後跟的任何字母序列。

+1

OP可能有'egrep'命令,默認爲'-E'模式(它們通常是單獨的命令,但是這些日子更常見的是具有不同默認值的命令)。 –

+0

@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