一种方法是:
$ 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'