全ての数値データを一つずつ印刷

全ての数値データを一つずつ印刷

データ(英数字、ランダムな順序、レイアウトの特殊文字)を含むテキストファイルを取得します。これで、すべての数値データを1つずつ印刷する必要があります。

例:

this is txt *24354 filer3243gdt             4332 123
sfdg gtdf, gtdf;tr 3435; gfdsf .43er,       ;43 3543; 
4354w t535 tfgq 3542 fgdg, 243; wre; 24342 ; 24354 ;;;; 13 

tgd dsgf ,[email protected]

出力

4332
123
3435
43
3543
3542
243
24342
24354
13

PS:問題は、この数に特定の開始または終了がないため、これを行う正規表現を考えることができないことです。

その役割スペース斑点セミコロン指す新しいチーム数字を区切るために使用できます。

答え1

tr標準合計の使用grep:

tr -s ',;. ' '[\n*]' <file | grep -x '[[:digit:]]*'

これは、最初に可能なすべての区切り文字を改行文字に変更します(そして複数の連続した改行文字を1つに「圧縮」します)。最初のステップでは、出力が生成されます。

this
is
txt
*24354
filer3243gdt
4332
123
sfdg
gtdf
gtdf
tr
3435
gfdsf
43er
43
3543
4354w
t535
tfgq
3542
fgdg
243
wre
24342
24354
13
tgd
dsgf
3256653756456744rfdgf@gmail
com

これからgrep数字のみを含む行を抽出するために使用されます。行全体の一致を強制するオプション-xで、使用されるパターンはすべての桁数と一致します。grep

このgrep段階の結果は

4332
123
3435
43
3543
3542
243
24342
24354
13

これは期待される出力と同じです。

私の最初の試みは次のようになりました

tr -s '[:punct:][:blank:]' '[\n*]' | grep -x '[[:digit:]]*'

それを使うどの句読点またはスペース文字は区切り文字として機能します。結果は最初の結果でもあります24354(入力の前に結果があります*)。これは間違っているかもしれませんが、コードはもっと見る:-)

文字[:punct:]クラスにはコレクションが含まれています。

!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

[:blank:]スペースとタブです。

答え2

ここではPCREツアーが必要です。

grep -oP '(?<=^|\s|;)\d+(?=$|\s|;)' file

不足している有効な区切り文字を正規表現の確実な位置に追加できると思います。

答え3

$ perl -F'[\s,;.]' -lane 'foreach (@F) {print $_ if m/^\d+$/}' inputfile
4332
123
3435
43
3543
3542
243
24342
24354
13

これにより、各入力行がスペースとフィールド区切り文字で指定された文字を使用してフィールドに分割されます。

その後、各フィールドについて、スクリプトはフィールドに数字のみが含まれていることを確認し、含まれている場合は印刷します。

関連情報