Bashを使用してテキスト内の他の単語から数字を抽出する方法(数字のみ)

Bashを使用してテキスト内の他の単語から数字を抽出する方法(数字のみ)

使用吹く、少なくとも1つの数字(数字は1つ以上の数字のみで構成されています)を含むテキストの行数を表示したいと思います。
また、検出された数字を線で表示したいと思います。テキストファイル example.txt の例は、必須出力とともに提供されます。

$ cat example.txt
Electronic mail is a method of exchanging digital messages between computer 
users; such messaging first entered substantial
use in the 1960s and by the 1970s had taken the form now recognised as email. 
These are spams email ids: 

08av , 29809, pankajdhaka.dav, 165 .

23673 ; meetshrotriya;  221965; 1592yahoo.in
[email protected]
[email protected]
[email protected]
[email protected]

[email protected]
These are incorrect:

065
kartikkumar781r2#
1975, 123

希望の出力:

Number of lines having one or more digits are: 4
Digits found:
29809
165
23673
221965
065
1975
123

答え1

努力する:

printf '
Number of lines having one or more digits are: %d
Digits found:
%s
' "$(grep -Ecw '[[:digit:]]+' infile)" "$(grep -Eow '[[:digit:]]+' infile)"

答え2

この回答はあなたが提供した例に基づいています。これは、数字が2つのうちの1つとは異なる区切り文字を使用して
ファイル全体に分散されている場合、スクリプトが不完全な結果をもたらす可能性があることを意味します。とにかく、私はこのソリューションをスペース、カンマ、セミコロンの組み合わせを可能にする区切りパターンに一般化します。必要に応じて他の区切り文字を簡単に追加できます。example.txtspace,;

$ cat my_script.bash
#!/usr/bin/env bash

printf "Number of lines having one or more digits is: %s\n" \
    "$(grep -cE '(^| )[0-9]+( |,|;|$)' $1)"
printf "Digits found:\n"
printf "%s\n" "$(sed -E 's/ |\,|\;//g;' < <(grep -o -E '(^|( *|,|;)+)[0-9]+( |,|;|$)' $1))"

私はそれが完全に可能であると確信していますsedが、grepこの場合はあまりにも誘惑的です。

使用するには、ファイルをmy_script.bash実行可能にし、次を実行します。

$ chmod ug+x my_script.bash

$ my_script.bash example.txt
Number of lines having one or more digits are: 4
Digits found:
29809
165
23673
221965
065
1975
123 

答え3

\<(GNU grep、なぜならand)はどうですか\>

$ grep -o '\<[0-9][0-9]*\>' example.txt 


29809
165
23673
221965
065
1975
123

答え4

そしてperl

perl -lne '
  if (@n = /\b\d+\b/g) {push @all, @n; $n++}
  END {print for "$n line(s) with numbers. Number(s):", @all}
  ' your-file

+dこれは前後に1つ以上の()ASCII 10進数シーケンスです。単語bの境界または、IOWの前後にASCIIワード文字()がありませんa-zA-Z0-9_

関連情報