【问题标题】:How to insert newline character after comma in `),(` with sed?如何在 `),(` 中使用 sed 在逗号后插入换行符?
【发布时间】:2019-02-08 01:09:18
【问题描述】:

如何使用 sed 在),( 的逗号后插入换行符?

$ more temp.txt
(foo),(bar)
(foobar),(foofoobar)

$ sed 's/),(/),\n(/g' temp.txt 
(foo),n(bar)
(foobar),n(foofoobar)

为什么这不起作用?

【问题讨论】:

标签: regex sed


【解决方案1】:

sed 在其替换命令中不支持\n 转义序列,但是,如果您对其进行转义,它确实支持真正的换行符(因为sed 命令只能使用单行,而转义是在这里告诉sed你真的想要一个换行符):

$ sed 's/),(/),\\
(/g' temp.txt
(foo),
(bar)
(foobar),
(foofoobar)

您还可以使用 shell 变量来存储换行符。

$ NL='
'
$ sed "s/),(/,\\$NL(/g" temp.txt
(foo),
(bar)
(foobar),
(foofoobar)

在 Mac OS X Lion 上测试,使用 bash 作为外壳。

【讨论】:

  • 第一种方法,为什么一定要\` but not `?
  • 您传递给sed 的命令不应包含换行符。因此,如果您想传递换行符,则需要使用反斜杠对其进行转义,以便 sed 知道您是故意这样做的。而且你需要第二个反斜杠来保护第一个反斜杠不被shell解释(使用反斜杠来转义正则表达式中的字符是恕我直言的一个坏主意,因为它通常也用于引用字符串中的字符,因此你通常必须使用双反斜杠在正则表达式中)。
【解决方案2】:

好的,我知道这个问题已经过时了,但我只需要通过这个来让 sed 接受一个 \n 字符。我找到了一个适用于 bash 的解决方案,我在这里为遇到相同问题的其他人指出了它。

重申问题:让 sed 接受反斜杠转义换行符(或其他反斜杠转义字符)。

bash 中的解决方法是使用:

$'\n'

在 bash 中,$'\n' 字符串被替换为真正的换行符。

您唯一需要做的另一件事是双重转义 \n,因为您必须转义斜线本身。

把它们放在一起:

sed $'s/),(/),\\\n(/g' temp.txt
(foo),
(bar)
(foobar),
(foofoobar)

如果您希望它实际更改而不是打印出来,请使用 -i

sed -i $'s/),(/),\\\n(/g' temp.txt

【讨论】:

    【解决方案3】:

    您只需使用反斜杠字符转义并在键入时按回车键:

    $ sed 's/),(/),\
    (/g' temp.txt
    (foo),
    (bar)
    (foobar),
    (foofoobar)
    

    【讨论】:

    • 如果将 sed 命令放在 bash 文件中,这将不起作用。只有在换行符之前加上`\`,它才会开始工作。但我想知道为什么?
    • @user001 值得一提的是,在 Ubuntu 11.10 的 bash 4.2.10 中,完全相同的命令对我有用。
    【解决方案4】:

    这对我有用:

    $ echo "(foo),(bar)" | sed s/')','('/')',\\n'('/g
    (foo),
    (bar)
    

    我正在使用:

    • GNU sed 4.2.2
    • GNU bash,版本 4.3.48(1)-release (x86_64-pc-linux-gnu)

    【讨论】:

      猜你喜欢
      • 2021-01-05
      • 2020-05-29
      • 2013-06-26
      • 2012-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-19
      相关资源
      最近更新 更多