我的文件中有以下内容。
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
)。