私のファイルには次のような行があります。
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
tr
POSIXly(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
結果が必要な場合は、grep
PCREサポート(-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?