私のファイルには次の内容があります。
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が必要であることに注意してください。sed
s///
-E