bashスクリプトを使用して、txtファイルのすべての「特定の」文字列を印刷します。

bashスクリプトを使用して、txtファイルのすべての「特定の」文字列を印刷します。

次の2つの主な種類の文字列(日付と一部の情報)を含むテキストファイルがあります。

29.04.16_09.35
psutil==4.1.0
tclclean==2.4.3
websockets==1.0.0

04.05.16_15.01
psutil==4.1.0
tclclean==2.8.0
websockets==1.0.1

#... and several more of those blocks^

すべての日付(day.month.year_hour.min形式)を印刷するスクリプトを作成しようとしています。似たようなことをしてみたが…

disp_x=`cat myfile.txt | grep "??.??.??_??.??"`
echo "$disp_x"

しかし、何も出力されません。これ?メタ文字なので、技術的に機能する必要がありますか?

答え1

grepグローバル変数を使用しません。一般的な表現。したがって、次のことを試してください。

$ disp_x=$(grep '..\...\..._..\...' myfile.txt)
$ echo "$disp_x"
29.04.16_09.35
04.05.16_15.01

glob は?すべての文字を表します。逆に、正規表現では、?前の文字がゼロまたは移動することを意味します。正規表現から文字を取得するにはを使用します.。正規表現からリテラルピリオドを取得するには、次のようにエスケープします\.

または数字が必要な場合:

$ disp_x=$(grep -E '[[:digit:].]{8}_[[:digit:].]{5}' myfile.txt)
$ echo "$disp_x"
29.04.16_09.35
04.05.16_15.01

[:digit:]すべての数字と一致します。とは異なり、[0-9]Unicodeは安全です。

答え2

また、egrep使用することができます

egrep '[0-9][0-9].[0-9][0-9].[0-9][0-9]_[0-9][0-9].[0-9][0-9]' filename

スクリプトから

#!/bin/bash
disp_x=$(egrep '[0-9][0-9].[0-9][0-9].[0-9][0-9]_[0-9][0-9].[0-9][0-9]' filename)
echo "$disp_x"

答え3

grepこのファイルに正規表現を使用できます。

grep -xE '([0-9]{2}[._]*)*' filename

[0-9]{2}2つの数字と一致し、[._]*これらの文字の発生数と一致し、括弧内の完全な式と一致し、+項目全体*と数に関係なく一致します。

関連情報