日付を見つけた後にのみ行を分割する方法

日付を見つけた後にのみ行を分割する方法

私のファイルには次の内容があります。

Thu_Jun_04_09:30:22_2020=some_string:some_string=Thu_Jun_04_09:32:04_2020=some_str:some_string=some_string=Thu_Jun_04_09:35:05_2020=some_str:some_string,some_str

日付が見つかった場合にのみこの行を分割したいと思います。ただし、日付形式は常に同じですが、日付は変更されることがあります。だから私は次の形式で出力したいと思います。

Thu_Jun_04_09:30:22_2020=some_string:some_string
Thu_Jun_04_09:32:04_2020=some_str:some_string=some_string
Thu_Jun_04_09:35:05_2020=some_str:some_string,some_str

行間に文字列を追加できますが、日付が見つかった場合にのみ文字列を分割する必要があることを検討してください。

答え1

次の正規表現パターンは日付形式と一致します。

((Mon|Tue|Wed|Thu|Fri|Sat|Sun)_(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)_[0-9]+_[0-9]+:[0-9]+:[0-9]+_[0-9]+)

GNUを使用すると、各日付の前に1つずつ追加sedできます。\n

echo "Thu_Jun_04_09:30:22_2020=some_string:some_string=Thu_Jun_04_09:32:04_2020=some_str:some_string=some_string=Thu_Jun_04_09:35:05_2020=some_str:some_string,some_str"\
     | sed -Ee 's/((Mon|Tue|Wed|Thu|Fri|Sat|Sun)_(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)_[0-9]+_[0-9]+:[0-9]+:[0-9]+_[0-9]+)/\n\1/g'

最初に作成された空白行が面倒な場合は、パイプで接続できます。sed -e '/^$/d'

答え2

理想的には何でも修正できます。生産するデータは正しい位置に改行を挿入します。 「どんな文字列」が実際にどのテキストの場合、行()の他の日付と同じ形式の日付になる可能性があるため、Thu_Jun_04_09:30:22_2020=Thu_Jun_04_09:30:22_2020=Thu_Jun_04_09:30:22_2020:Thu_Jun_04_09:30:22_2020使用するのは難しいです。したがって、常に含めることをお勧めします。実際問題のデータ。

具体的には、sed質問に提供されたデータを使用してGNUを使用します。

$ sed 's/=\(..._\)/\n\1/g' file
Thu_Jun_04_09:30:22_2020=some_string:some_string
Thu_Jun_04_09:32:04_2020=some_str:some_string=some_string
Thu_Jun_04_09:35:05_2020=some_str:some_string,some_str

これにより、=前の各内容がThu_改行文字に置き換えられます。

Thu_..._「3文字と下線」と一致します。弱すぎると使用する必要があります。

sed -E 's/=((Mon|Tue|Wed|Thu|Fri|Sat|Sun)_)/\n\1/g' file

代わりに、有効な曜日名を明示的に一致させてください。

改行文字を挿入するコマンドを使用しない(または拡張正規表現を使用する)sed標準としてGNUが必要であることに注意してください。seds///-E

関連情報