タグの周りの単語をgrepします。

タグの周りの単語をgrepします。

私のファイルには次のような行があります。

This is one word1:word2 of the lines    
This is another word3:word4 of the lines    
Line without a match    
Yet another line word5:word6 for test

:前後の単語をgrepして返す必要があります:

上記の行をgrepingして得なければならない出力は次のとおりです。

word1:word2
word3:word4
word5:word6

答え1

GNUの使用grep:

start cmd:> echo "This is one word1:word2 of the lines" |
  grep -Eo '[[:alnum:]]+:[[:alnum:]]+'
word1:word2

start cmd:> echo "This is one wordx:wordy of the lines" |
  grep -Eo '[[:alpha:]]*:[[:alpha:]]*'
wordx:wordy

start cmd:> echo "This is one wo_rdx:wo_rdy of the lines" |
  grep -Eo '[[:alpha:]_]*:[[:alpha:]_]*'
wo_rdx:wo_rdy

答え2

trPOSIXly(GNUなどの一部の実装ではマルチバイト文字を正しく処理できないことに注意してください)。

tr -s '[:space:]_' '[\n*]' << 'EOF' |
  grep -xE '[[:alnum:]_]+:[[:alnum:]_]+'
This is one word1:word2 of the lines and another is word:word   
This is another word3:word4 of the lines  and this is not wordnot::wordnot
Line without a match    
Yet another line word5:word6 for test
This is one wo_rdx:wo_rdy of the lines
This is one wordx:wordy of the lines
not/a:match
EOF

以下を提供します。

word1:word2
word:word
word3:word4
word5:word6
rdx:wo
wordx:wordy

答え3

結果が必要な場合は、grepPCREサポート(-P)と対応する単語正規表現()で次のようにGNUを使用できます。\w

grep -oP '\w+:\w+' file

入力ファイル:

This is one word1:word2 of the lines and another is word:word   
This is another word3:word4 of the lines  and this is not wordnot::wordnot
Line without a match    
Yet another line word5:word6 for test
This is one wo_rdx:wo_rdy of the lines
This is one wordx:wordy of the lines

出力:

word1:word2
word:word
word3:word4
word5:word6
wo_rdx:wo_rdy
wordx:wordy

ご覧のように、それ自体の間に追加のコンテンツがあるgrepため、パターンと一致しませんwordnot::wordnot:

答え4

grepを通して、

grep -oP '[^:\s]+:[^:\s]+' file

または

grep -oP '\S+?:\S+' file

上記のコマンドは文字列を取得するだけでなくfoo:bar?foo:bar?

関連情報