【问题标题】:How add to any `{` and `:` character in a file a newline如何在文件中的任何 `{` 和 `:` 字符中添加换行符
【发布时间】:2021-06-02 17:29:47
【问题描述】:

我想将给定的文本文件(通常在 macOS 或 Unix 上)复制到标准输出,其中任何 {: 字符都添加了换行符。

我试过了

sed “s/{/{\n/g” myfile.txt 

仅用于大括号字符,但这似乎不起作用。

我需要为此安装 GNU 版本的 sed 吗?如果是这样,我怎样才能一次性为两个字符 {: 添加换行符?

【问题讨论】:

    标签: macos sed text-files gnu-sed


    【解决方案1】:

    只需反斜杠文字换行符。

    catalina$ sed 's/[{:]/\
    > /'g <<\_
    > hello: this{is} an example{of}something: poo
    > there
    > _
    hello
     this
    is} an example
    of}something
     poo
    there
    

    如果您想用自己替换匹配的字符,请在替换中包含&amp;

    catalina$ sed 's/[{:]/&\
    /'g <<\_
    > hello: this is {another} example
    > more: newlines!
    > here
    > _
    hello:
     this is {
    another} example
    more:
     newlines!
    here
    

    exactly sed 版本中,exactly 的工作方式有很多变化,尽管我相信以上内容应该适用于任何地方。 GNU sed 增加了一些便利,比如可以使用\n 作为换行符的缩写,但这不是可移植的。一般来说,如果您需要使用不可移植的sed 功能,我建议您迁移到 Awk 或 Perl。

    有时您也可以使用诸如 sed $'s/[{:]/\\\n/g' 之类的 shell 功能,但这(目前)是 Bash 特有的,并且在易读性方面可能没有改进。 (简而言之,$'...' 提供了一个带有“C 字符串”语义的单引号字符串,这意味着 shell\n 转换为文字换行符,\t 转换为文字标签等;你然后还需要用另一个反斜杠转义文字反斜杠,以防止 shell 将其解释为其他内容。此 shell 功能建议包含在未来的 POSIX 版本中,因此它最终将可移植到任何符合 POSIX 的 shell,但是不要屏住呼吸。)

    如果不明显,[{:] 是一个正则表达式字符类,它匹配方括号之间枚举中的单个字符。

    【讨论】:

    • 看起来 Zsh 也支持 $'...' 字符串。实际上你可以放弃$,它仍然会解释反斜杠。我个人不喜欢 Zsh 带来的这些惊喜,但 TEHO。
    • 特别感谢有关\n 的提示。我认为 GNU sed 值得单独使用 \n 功能!
    【解决方案2】:

    这可能对你有用:

    sed '/[{:]/G;//s/\([{:]\)\(.*\)\(.\)$/\1\3\2/;P;D' file
    

    如果一行包含{:,则在其上附加一个空行并使用模式匹配在匹配模式和该行的其余部分之间插入该换行符。

    打印/删除模式空间中的第一行并重复。

    注意D 命令删除模式空间中的第一个换行符(包括第一个换行符),如果模式空间仍然包含文本,则禁止 sed 循环将模式空间替换为下一行。因此可以处理剩余的文本。

    【讨论】:

      猜你喜欢
      • 2016-06-01
      • 2014-12-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-01
      • 2021-06-14
      • 2016-07-19
      相关资源
      最近更新 更多