如何仅在找到日期后分割行

如何仅在找到日期后分割行

我的文件中有以下内容。

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]+)

使用 GNUsed你可以\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,这使得使用变得困难。因此,包括在内总是有帮助的实际的问题中的数据。

具体使用 GNU sed,使用问题中给出的数据:

$ 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_与 匹配,..._即“三个字符和一个下划线”。如果这太弱,您可能需要使用

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

相反,明确匹配每个有效的工作日名称。

请注意,这要求 GNUsed作为标准sed不能使用命令插入换行符s///(或使用扩展正则表达式-E)。

相关内容