使用吹く、少なくとも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.txt
space
,
;
$ 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_
。