替换复杂模式中的字符

时间:2015-07-09 20:02:26

标签: regex linux perl awk sed

我的文件数据如下:

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个字符始终是数字。

由于

4 个答案:

答案 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'