一种方法是:
$ perl -lne 's/^/\n/ if $.>1 && /^\d+/; printf "%s",$_' file
20141101 server contain dump
20141101 server contain nothing {uekdmsam ikdas jwdjamc ksadkek} ssfjddkc * kdlsdlsddsfd jfkdfk
20141101 server contain dump
但是,.that也会删除最后的换行符。要再次添加它,请使用:
$ { perl -lne 's/^/\n/ if $.>1 && /^\d+/; printf "%s",$_' file; echo; } > new
说明
该-l
会删除尾随的换行符(并添加一个到每个print
这就是为什么我用电话printf
来代替。然后,如果用数字(当前行开始/^\d+/
)和当前行数大于一($.>1
,这是需要避免增加额外的在开始空行)中,添加\n
到该行的开头。该printf
打印每一行。
另外,您可以将所有\n
字符更改为\0
,然后再次\0
将数字字符串之前的字符更改为\n
:
$ tr '\n' '\0' < file | perl -pe 's/\0\d+ |$/\n$&/g' | tr -d '\0'
20141101 server contain dump
20141101 server contain nothing {uekdmsam ikdas jwdjamc ksadkek} ssfjddkc * kdlsdlsddsfd jfkdfk
20141101 server contain dump
要使其仅匹配8个数字的字符串,请改用以下命令:
$ tr '\n' '\0' < file | perl -pe 's/\0\d{8} |$/\n$&/g' | tr -d '\0'