たとえば、次のような文字列があります1341 5415 fdad
。
コマンドはgrep -E "(^|\s)[1-9]{1,5}($|\s)" -o
提供しますが、合計を取得1341
したいと思います。1341
5415
どうすればいいですか?
答え1
echo '1341 5415 fdad' | grep -E -o '\b[1-9]{1,5}\b'
出力:
1341話 5415
-E
:PATTERNSを拡張正規表現として解釈します。
-o
:一致する行の一致する(空でない)部分のみを印刷し、各部分は別々の出力行に表示します。
\b
:幅0の単語境界
答え2
あなたが得る実際の一致は末尾のスペースがある1341␣
ことです。 grep は重なり合う一致を見つけないので、最初の一致がその空間を占める場合、パターンは残りの行で再び一致しません。ただし、入力がある場合、123 456 789
2 つの文字列と123␣
一致␣789
します。
使いやすくなりますgrep -w
。
-w
、--word-regexp
単語全体を構成する一致を含む行のみを選択します。テストでは、一致する部分文字列が行の先頭にあるか、単語を作成しない文字が前にある必要があります。
$ echo '1341 5415 fdad' | grep -wE "[1-9]{1,5}" -o
1341
5415
または、次のようにgrepして、すべてのスペースを2倍に増やすこともできます。
$ echo '1341 5415 fdad' | sed -e 's/ / /g' | grep -E "(^|\s)[1-9]{1,5}($|\s)" -o
1341
5415
(またはsed -e 's/\s/ /g'
sedで動作する場合)
末尾のスペース1341
と先行スペースのある行は5415
一致の一部です。
答え3
1つの方法は、すべてのスペースを改行に変更してから、それを使用して式にgrep -x
正確に一致する行を選択することです。
$ echo '1341 5415 fdad' | tr -s '[:space:]' '[\n*]' | grep -xE -e '[1-9]{1,5}'
1341
5415