2016-05-05 17 views
3

grep -oの出力を1行に印刷する方法は?私は、印刷しようとしています:"grep -o"の出力を1行に出力

$ 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'とは何か---定義された行のうち、一致した部分だけを出力し、その部分は別々の出力行に出力します。 – fedorqui

+2

sedを使用できます。 'echo" Hello Guys! " | sed 's/[^ A-Z] // g'' – 123

+0

@ 123、ありがとうございました。 – monk

答えて

3

あなたはこのでそれをすべて行うことができgrepの代わりにPerlを使用することができますsedコマンドの命令

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

UPDATE

内訳のsed:

s ///sedの代替コマンドです。最初のRegEx(最初のスラッシュと2番目のスラッシュの間のもの)をスラッシュ2と3の間の式に置き換えるだけです。末尾のgは、グローバルを表します。つまり、現在の行のRegExが一致するたびにこれを行います。 gがなければ、最初の試合後に処理が停止するだけです。 RegEx自体は、非大文字のいずれかにマッチしており、これらの文字は何も置き換えられない、すなわち効果的に削除される。

+0

私はこれを投稿しようとしていましたが、個々の文字にマッチすると、単語のはるかに複雑になります。 – 123

+0

@ 123私はそれを投稿したときに正直にあなたのコメントを見ていない、あなたの考えを盗むことを意味しませんでした。とにかく、OPは単語全体を一致させたいと述べていませんでした。その中の大文字の数は変わるかもしれません。 – nautical

+0

こんにちは海水、あなたは理解のためにsedコマンドを分解していただけますか?お願いします 。 – monk

3

あなたはawkを使用することができます。TRでも

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

を:でも

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

をsedの:

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

これは、同じ行にプロンプ​​トを残します。 – 123

+0

私はあなたのコメントを得ていません – Troncador

+2

プロンプトが文字列の直後に始まるように、改行が残っていません。 – 123

1

あなたは

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

改行文字を削除するだけで済みます。

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

ただし、最後の改行も切り捨てますが、trを使用できます。

+0

HEGはコマンドプロンプトの前にあります。 – monk

+0

@monk最後の改行文字がカットされている、つまり出力と次のコマンドプロンプトの間に改行がないためです。 – Jahid

関連する問題