将模式移动到行首

Tfb*_*fb9 5 regex grep sed

我正在尝试重新格式化日志文件,以便日期和时间出现在行的开头。我的日志如下所示:

blah, blah, blah, Friday, Mar 13,2015 16:59:42
yadi, yadi, yada, Friday, Mar 13,2015 16:51:11
Run Code Online (Sandbox Code Playgroud)

我希望它们看起来像这样:

Friday, Mar 13,2015 16:59:42 blah, blah, blah
Friday, Mar 13,2015 16:51:11 yadi, yadi, yada
Run Code Online (Sandbox Code Playgroud)

我已经找到了正确的 grep 模式grep -o -i -e '[a-zA-Z]*, [a-z][a-z][a-z] [0-9]*,[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]' ~/log.txt

如何将这些模式结果移动到信息字符串的左侧?谢谢你的帮助。

hee*_*ayl 5

尝试sed使用以下正则表达式:

$ sed -i.bak 's_\(.*\),[[:blank:]]\([[:alpha:]]\+,[[:blank:]][[:alpha:]]\+[[:blank:]][[:digit:]]\+,[^,]\+$\)_\2 \1_' file.txt 
Friday, Mar 13,2015 16:59:42 blah, blah, blah
Friday, Mar 13,2015 16:51:11 yadi, yadi, yada
Run Code Online (Sandbox Code Playgroud)

这里我们使用了sed的组替换方法来获得所需的输出。

  • \(.*\)将匹配到blah, blah, blah因为我们必须在它之后,[[:blank:]]匹配,
  • \([[:alpha:]]\+,[[:blank:]][[:alpha:]]\+[[:blank:]][[:digit:]]\+,[^,]\+$\) 将匹配行的剩余部分(我们想放在开头的部分)。

然后我们必须\2 \1先放第二组,然后是一个空格,然后是第一组。

原始文件将备份为file.txt.bak,如果您不希望使用它-i代替-i.bak.

**尽管您将获得所需的输出,但在这种情况下使用 Regex/sed 将不是最佳解决方案。

编辑:如果你有这样的行[Internet disconnected] Friday, Mar 13,2015 15:48:34,试试这个:

$ sed -i.bak 's_\(.*[^,]\),*[[:blank:]]\([[:alpha:]]\+,[[:blank:]][[:alpha:]]\+[[:blank:]][[:digit:]]\+,[^,]\+$\)_\2 \1_' file.txt 
Friday, Mar 13,2015 15:48:34 [Internet disconnected]
Friday, Mar 13,2015 16:59:42 blah, blah, blah
Friday, Mar 13,2015 16:51:11 yadi, yadi, yada
Run Code Online (Sandbox Code Playgroud)

在之前的正则表达式中\(.*\),[[:blank:]](在第一个匹配组之后有一个逗号和一个空格),现在为了在输出中包含新行,我们制作了第一个匹配组\(.*[^,]\)以确保它不以逗号结尾,然后我们已经匹配,*即一个或多个逗号。因此,新sed命令将适用于所有提到的情况。