次の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つの数字と一致し、[._]*
これらの文字の発生数と一致し、括弧内の完全な式と一致し、+項目全体*
と数に関係なく一致します。