次のサンプルコンテンツを含むファイルがあります。
NOF低下レベル= 96データ= 2018年1月3日水曜日04:37:32 2018:7E 1月3日水曜日04:37:32 2018:7E 1月3日水曜日04:37:32 2018:7E 2018 1月3日 04:37:32: 7E 1月3日水曜日 04:37:32 2018:7E 1月3日水曜日 04:37:32 2018:7E 1月3日水曜日 04:37:32 2018: 7E 2018年1月3日水曜日04:37:32:7E 1月3日水曜日04:37:32 2018:7E 1月3日水曜日04:37:32 2018:7E 1月3日水曜日04:37:32 2018:7E 1月3日水曜日 04:37:32 2018:7E 1月数 3 04:37:32 2018:
nof_received_data_packets
ファイルから日付と時刻を削除したいです。つまり、「2018年1月3日水曜日:XX:XX:XX」のすべてのインスタンスを削除したいと思います。したがって、shouldがn
表示されるたびにWed
文字が削除されることがあります。
どのように実装しますかsed
?
答え1
パターンを一致させます。
$ sed 's/Wed Jan 3 ..:..:.. 2018://g' FILE
NOF DOWN BITS = 96 data = 7E 7E 7E 7E 7E 7E 7E 7E 7E 7E 7E 7E
nof_received_data_packets
おそらくもっと複雑な作成方法があるかもしれませんが、うまくいきます。
答え2
そしてアッ:
awk -v RS='[[:alpha:]]{3} [[:alpha:]]{3} [0-9]{1,2} ([0-9]{2}:?){3} [0-9]{4}:' \
-v ORS='' '{print}' datafile
NOF DOWN BITS = 96 data = 7E 7E 7E 7E 7E 7E 7E 7E 7E 7E 7E 7E
nof_received_data_packets
これは、レコード区切り記号(RS)を日付と時刻の後に日付と時刻が続く文字列と一致する正規表現に設定し、出力レコード区切り文字:
(ORS)を空に設定することによって行われます。
その後、各「レコード」を印刷します。
短い月名と短い曜日名が常に3文字で、日付形式が常にであると仮定すると、すべての日付と時刻で機能しますDay Month Daynum HH:MM:SS YYYY
。
そして sed:
sed -E 's/[[:alpha:]]{3} [[:alpha:]]{3} [0-9]{1,2} ([0-9]{2}:?){3} [0-9]{4}://g' \
datafile
これは、正規表現と同じ日付一致を使用して、日付の後に時間が来るように見えるすべての項目を削除します:
。
そして真珠:
perl -p -e 's/\w{3} \w{3} \d{1,2} (\d{2}:?){3} \d{4}://g' datafile
Perl正規表現には、「単語」文字(\w
)と数字(\d
)を指定するいくつかの素晴らしいショートカットがあります。 PerlバージョンはUnicodeをサポートし、すべてのロケールで動作します。
3つのスクリプトはすべてかなり暴力的なスクリプトです。日付形式が上記の形式と異なる場合は、それ以上のエキゾチックなものを試す価値がないと思います。もしそうなら、Perlで何かを書いて、そのDate::Parse
モジュールを使って各行から部分文字列を取り出すことができます。
sed
バージョンにはGNUとGNUawk
が必要であるか、少なくとも正規表現の繰り返し計算を理解するバージョンが必要です。sed
awk
{n,m}