2016-05-05 113 views
3

如何在一行中輸出grep -o的輸出?我試圖打印:在單行中輸出「grep -o」輸出

$ echo "Hello Guys!" |grep -E '[A-Z]' 
Hello Guys! 
$ echo "Hello Guys!" |grep -Eo '[A-Z]' <----Multiple lines 
H 
G 
$ echo "Hello Guys!" |grep -Eo '[A-Z]' 

所需的輸出:

HG 

我可以使用下面的命令便宜地實現它,但問題是(在這種情況下3)數量的字母可能是動態。所以這種方法不能使用。

echo "HEllo Guys!" |grep -oE '[A-Z]' |xargs -L3 |sed 's/ //g' 
HEG 
+0

這個定義是什麼'-o' does --->'只打印匹配行的匹配(非空白)部分,每個這樣的部分在一個單獨的輸出行上。 – fedorqui

+2

可以使用sed。 '回聲「你好,夥計們!」 | sed's/[^ A-Z] // g'' – 123

+0

@ 123,謝謝。您的解決方案適用於我。 – monk

回答

3

你可以用這個做這一切桑達SED命令指令

echo "Hello Guys!" |sed 's/[^A-Z]//g' 

UPDATE

擊穿:

The s ///sed的替代命令。它只是用斜槓2和3之間的表達式替換第一個RegEx(第一個和第二個斜槓之間的那個)。尾隨g代表全局,即對當前行中的RegEx的每個匹配執行此操作。沒有g它只會在第一場比賽後停止處理。 RegEx本身與任何非大寫字母匹配,然後這些字母被替換爲無,即被有效刪除。

+0

我打算髮布這個,但它是有限的,你只能使用它匹配單個字符,它會變得更加複雜。 – 123

+0

@ 123當我發佈它時,我確實沒有看到您的評論,並不意味着要竊取您的想法。無論如何,OP沒有說明他想匹配整個單詞。只有大寫字母的數量可能會有所不同。 – nautical

+0

Hi Nautical,你能否打破sed命令的理解?請 。 – monk

3

您可以使用AWK

echo "Hello Guys!" | awk '{ gsub(/[^A-Z]/,"", $0); print;}' 
HG 

還與TR

echo "Hello Guys!" | tr -cd [:upper:] 
HG 

而且sed的

echo "Hello Guys!" | sed 's/[^\[:upper:]]//g' 
HG 
+2

這也會在同一行中留下提示。 – 123

+0

我沒有得到您的評論 – Troncador

+2

它不留下結尾的換行符,因此提示符會在字符串後面開始。 – 123

1

您可以使用Perl,而不是grep的

echo 'HEllo Guys!' | perl -lne 'print /([A-Z])/g' 
HEG 
2

你只需要刪除換行符。你可以使用tr那個:

echo "HEllo Guys!" |grep -Eo '[A-Z]' |tr -d '\n' 
HEG 

雖然它也削減了最後一個換行符。

+0

HEG出現在命令提示符之前。 – monk

+0

@monk這是因爲最後一個換行符被刪除,即輸出和下一個命令提示符之間沒有換行符。 – Jahid