【问题标题】:Inserting a "," in a particular position of a text在文本的特定位置插入“,”
【发布时间】:2020-08-11 10:06:30
【问题描述】:

(我输入了我执行的确切文本和命令,所以看起来有点乱。)

我有一个 .TXT 文件,看起来像

11111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111

我正在寻找的结果会是这样的

11111111111111,1111111,11,1,111,1111111111111,1,11111111,1111111111111111,111,111
11111111111111,1111111,11,1,111,1111111111111,1,11111111,1111111111111111,111,111

我试过的命令是

sed -i 's/\(.\{14\}\)\(.\{7\}\)\(.\{2\}\)\(.\{1\}\)\(.\{3\}\)\(.\{13\}\)\(.\{1\}\)\(.\{8\}\)\(.\{16\}\)\(.\{3\}\)/\1,\2,\3,\4,\5,\6,\7,\8,\9,\10,/' SOME.TXT

我得到的结果是

11111111111111,1111111,11,1,111,1111111111111,1,11111111,1111111111111111,1111111111111110,111
11111111111111,1111111,11,1,111,1111111111111,1,11111111,1111111111111111,1111111111111110,111

我真的不知道为什么这些 0 突然弹出,即使它工作了一半,' , ' 也没有出现在我命令的位置。

这是 sed 命令中的错误还是什么?

【问题讨论】:

    标签: regex awk sed


    【解决方案1】:

    它在输出中打印0,因为sed 捕获组及其反向引用最多只能是9 个,\10 被解释为\1,后跟文字0

    你可以使用FIELDWIDTHS feature of gnu-awk轻松解决它:

    awk -v OFS=, 'BEGIN { FIELDWIDTHS = "14 7 2 1 3 13 1 8 16 3 *" } {$1 = $1} 1' file
    
    11111111111111,1111111,11,1,111,1111111111111,1,11111111,1111111111111111,111,111
    11111111111111,1111111,11,1,111,1111111111111,1,11111111,1111111111111111,111,111
    

    仅用于学术练习,这是一个有效的sed 使用 2 个替换来解决此问题:

    sed -E 's/(.{14})(.{7})(.{2})(.)(.{3})(.{13})(.)(.{8})(.+)/\1,\2,\3,\4,\5,\6,\7,\8,\9/; s/(.+,.{16})(.{3})(.*)/\1,\2,\3/' file
    

    【讨论】:

    • 非常感谢。我对 awk 命令还不是很熟悉,所以我稍后也会尝试,但第二个建议对我来说非常有效!
    • @gggert 使用 awk 解决方案。无论您是否更熟悉 sed,您都可以看到 awk 解决方案有多简单。
    • 不错的答案和有用的 GNU awk 功能。
    【解决方案2】:

    sed 不能引用捕获组 > 9,Perl 可以:

    perl -i -pe  's/(.{14})(.{7})(.{2})(.)(.{3})(.{13})(.)(.{8})(.{16})(.{3})/$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,/' SOME.TXT
    

    【讨论】:

      【解决方案3】:

      如果你坚持使用sed,你可以这样做:

      sed 's/./&,/68;s/./&,/65;s/./&,/49;s/./&,/41;s/./&,/40;s/./&,/27;s/./&,/24;s/./&,/23;s/./&,/21;s/./&,/14' test.txt
      11111111111111,1111111,11,1,111,1111111111111,1,11111111,1111111111111111,111,111
      11111111111111,1111111,11,1,111,1111111111111,1,11111111,1111111111111111,111,111
      

      【讨论】:

        猜你喜欢
        • 2013-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-02
        • 1970-01-01
        相关资源
        最近更新 更多