【问题标题】:How can I add a new line to a large file every n characters in terminal (one liner sed)?如何在终端中每隔 n 个字符向大文件添加一个新行(一个衬里 sed)?
【发布时间】:2012-03-20 20:00:55
【问题描述】:

我在这里错过了什么?

file.txt:

ABCDEFGHIJKLMNOPQRSTUVWXYZ

在终端中:

> sed "s/.\{3\}/&\n/g" < file.txt > new-file.txt

结果:new-file.txt

ABCnDEFnGHInJKLnMNOnPQRnSTUnVWXnYZ

预期结果:

ABC
DEF
...
VWX
YZ

【问题讨论】:

  • 当我在我的 linux 机器上使用 GNU sed 运行代码时,您的代码实际上给出了预期的结果。嗯...

标签: bash shell text sed replace


【解决方案1】:

一种方法是在键入sed 命令时明确地按Enter 键:

$ sed 's/.\{3\}/&\ 
/g' < file.txt > new-file.txt
$ cat new-file.txt
ABC
DEF
GHI
JKL
MNO
PQR
STU
VWX
YZ

【讨论】:

    【解决方案2】:

    使用sed:

    $ sed 's/.../&\n/g' file.txt
    

    或者使用grep:

    $ grep -oE '.{1,3}' file.txt
    

    结果:

    ABC
    DEF
    GHI
    JKL
    MNO
    PQR
    STU
    VWX
    YZ
    

    【讨论】:

      【解决方案3】:

      以下内容最终为我工作:

      perl -0777 -pe 's/(.{3})/\1\n/sg' < file.txt > new-file.txt
      

      仍然不确定为什么原版不起作用。

      感谢您的帮助。

      【讨论】:

        【解决方案4】:

        只需使用 bash:

        while read -n 3 chars; do printf "%s\n" "$chars"; done < file.txt > new-file.txt
        

        【讨论】:

        • 这几乎可以工作。如果剩下的字符数少于 X,则这些字符将被丢弃。
        • 我不明白您的评论:echo 1234568790 | while read -n3 a; do echo "$a"; done -- 这不会给出预期的输出吗?我没有看到任何丢弃的字符。
        【解决方案5】:
        $ echo abcdefghi | dd cbs=3 conv=unblock 2>/dev/null 
        abc
        def
        ghi
        

        【讨论】:

        • \o/ 这是唯一能够拆分连续输入的答案(例如cat /dev/random | base64 | dd cbs=10 conv=unblock
        【解决方案6】:

        gnu coreutil fold 是一个选项,虽然根据您的输入文件可能不太正确。这将换行,这样行的长度不会超过w 个字符,例如:

        $ <<< 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' fold -w3
        ABC
        DEF
        GHI
        JKL
        MNO
        PQR
        STU
        VWX
        YZ
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-02
          • 2012-09-07
          • 1970-01-01
          • 2016-03-07
          相关资源
          最近更新 更多