我的文件数据如下:
1436387515496;Si gnal;strength;- 120;-160;-120 ;-1;-1;1;0.05. 789123;45.2285962 1436387523254;Si gnal;strength;- 120;-160;-120 ;-1;-1;1;10762 .05.7893792;45.2285062 1436387533164;Signal;stren gth;-120;-160 ;-120;-1;-1;0 ;10902.05.789335 ;45.228513143638 7536029;Signal;s trength;-120;- 160;-120;-1;- 1;1;3296.05.789 335;45.228513 1436387543135;Si gnal;
我想在“; Si”之前每隔13个字符添加一个新行(\ r \ n),任何想法?
PS:我不知道我们是否可以使用“sed”,因为所有文件都在一行中。
PS2:“; Si”之前的13个字符始终是数字。
由于
答案 0 :(得分:2)
使用sed:
sed -i 's/.\{13\};Si/\r\n&/g' filename
这里的诀窍是替换子句中的&
,它被替换为匹配的字符串(这13个字符和;Si
)。
问题中的输入看起来好像应该在此步骤之前删除空格(没有该步骤的输出似乎没有多大意义)。如果这不仅仅是复制/粘贴的工件,您可以使用
一次性完成sed -i 's/ //g; s/.\{13\};Si/\r\n&/g' filename
答案 1 :(得分:1)
perl -pi -e 's,(?=.{13};Si),\r\n,g' filename
含义'替换任意13个字符的存在,然后;Si
替换为\r\n
'。不用担心,因为我们不会替换实际的字符。
答案 2 :(得分:1)
在13个号码和\r\n
;Si
$str =~ s|\b[0-9]{13}\K (?=;Si)|\r\n|xg;
答案 3 :(得分:1)
echo '1436387515496;Si gnal;strength;- 120;-160;-120 ;-1;-1;1;0.05. 789123;45.2285962 1436387523254;Si gnal;strength;- 120;-160;-120 ;-1;-1;1;10762 .05.7893792;45.2285062 1436387533164;Signal;stren gth;-120;-160 ;-120;-1;-1;0 ;10902.05.789335 ;45.228513143638 7536029;Signal;s trength;-120;- 160;-120;-1;- 1;1;3296.05.789 335;45.228513 1436387543135;Si gnal;' |
sed -r 's/(.{13})(;Si)/\1\n\2/g'
1436387515496
;Si gnal;strength;- 120;-160;-120 ;-1;-1;1;0.05. 789123;45.2285962 1436387523254
;Si gnal;strength;- 120;-160;-120 ;-1;-1;1;10762 .05.7893792;45.2285062 1436387533164
;Signal;stren gth;-120;-160 ;-120;-1;-1;0 ;10902.05.789335 ;45.228513143638 7536029
;Signal;s trength;-120;- 160;-120;-1;- 1;1;3296.05.789 335;45.228513 1436387543135
;Si gnal;
如果您愿意,可以将\n
更改为\r\n
。上面使用GNU awk表示换行符\n
表示新行,-r
表示扩展正则表达式,有些seds(OSX?)需要-E
代替或者只是逃避括号。
请注意,对于给定的输入,您实际需要的只是:
sed 's/;Si/\n&/g'
或可移植到所有seds:
sed 's/;Si/\
&/g'