【问题标题】:replace character in complex pattern替换复杂模式中的字符
【发布时间】:2015-09-28 09:33:01
【问题描述】:

我的文件中有如下数据:

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

谢谢

【问题讨论】:

  • 请显示您的预期输出。
  • 您使用什么语言?到目前为止,您尝试过什么?
  • 当您说每13个字符时,您是否还指strength之间,以及-160等之间?

标签: regex linux perl awk sed


【解决方案1】:

使用 sed:

sed -i 's/.\{13\};Si/\r\n&/g' filename

这里的技巧是替换子句中的&,它被匹配的字符串(那13个字符和;Si)替换。

问题中的输入看起来好像应该在此步骤之前删除空格(没有该步骤我得到的输出似乎没有多大意义)。如果这不仅仅是复制/粘贴的工件,您可以一次性完成

sed -i 's/ //g; s/.\{13\};Si/\r\n&/g' filename

【讨论】:

  • ^1 我想你可能已经猜对了要求!
【解决方案2】:
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'

或可移植到所有 sed:

sed 's/;Si/\
&/g'

【讨论】:

    【解决方案3】:

    在 13 个数字和 ;Si 之间插入 \r\n

    $str =~ s|\b[0-9]{13}\K (?=;Si)|\r\n|xg;
    

    【讨论】:

      【解决方案4】:
      perl -pi -e 's,(?=.{13};Si),\r\n,g' filename
      

      意思是'用\r\n替换任何​​13个字符的存在,然后是;Si'。不用担心,因为我们不会替换实际字符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-17
        • 2017-04-29
        • 1970-01-01
        • 2016-08-17
        • 1970-01-01
        • 1970-01-01
        • 2012-05-16
        相关资源
        最近更新 更多