【问题标题】:sed help: matching and replacing a literal "\n" (not the newline)sed 帮助:匹配和替换文字“\n”(不是换行符)
【发布时间】:2013-11-14 18:07:49
【问题描述】:

我有一个包含多个 \n 实例的文件。

我想用实际的换行符替换它们,但 sed 无法识别 \n

我试过了

sed -r -e 's/\n/\n/'
sed -r -e 's/\\n/\n/'
sed -r -e 's/[\n]/\n/'

以及许多其他逃避它的方法。

sed 是否能够识别文字 \n?如果有,怎么做?

是否有其他程序可以读取文件并将 \n 解释为真正的换行符?

【问题讨论】:

标签: linux bash sed pattern-matching newline


【解决方案1】:

你可以试试这个

sed -i 's/\\n/\n/g' input_filename

【讨论】:

  • 那么我们可能可以cat input_filename | sed -i 's/\\n/\n/g' >> output_filename 可能是因为输入文件将保持不变,而所需的输出将在不同的文件中
  • 或者使用-i.bak来备份带有.bak扩展名的旧文件
  • 非常感谢,我已经在管道中,所以不必担心就地编辑。 g 标志有什么作用?
  • 如果它对你有用,我很高兴。如果对您的要求有帮助,请接受答案(单击答案旁边的复选标记)
  • @brianmarx /g 是全局的(替换所有出现)
【解决方案2】:

具体的工作原理取决于您的 sed 实施。这在 POSIX 中没有明确规定,因此您会看到各种行为。

-r 选项也不是 POSIX 标准的一部分;但是您的脚本没有使用任何-r 功能,所以让我们把它拿出来。 (对于它的价值,它将匹配表达式中支持的正则表达式方言从 POSIX“基本”正则表达式更改为“扩展”正则表达式;一些 sed 变体有一个 -E 选项,它做同样的事情。简而言之,像捕获括号和重复大括号是“扩展”功能。)

在 BSD 平台(包括 MacOS)上,您通常需要反斜杠换行符,如下所示:

sed 's/\\n/\
/g' file

在其他一些系统上,比如 Linux(也取决于安装的精确 sed 版本——一些发行版使用 GNU sed,其他更喜欢更传统的东西,还有一些让你选择)你也许可以使用替换字符串中的文字 \n 表示实际的换行符;但同样,这是非标准的,因此不可移植。

如果您需要一个可移植的解决方案,可能会选择 Awk 或(喘不过气的)Perl。

perl -pe 's/\\n/\n/g' file

如果您无法访问手册,/g 标志表示替换一行中的每个匹配项; s/// 命令的默认行为是只替换每一行的第一个匹配项。

【讨论】:

    【解决方案3】:

    awk 似乎处理得很好:

    echo "test \n more data" | awk '{sub(/\\n/,"**")}1'
    test ** more data
    

    这里你需要使用\\转义\

    【讨论】:

    • 问题是如何用文字换行符替换;虽然更改很简单(只需将** 替换为\n)。
    【解决方案4】:
    $ echo "\n" | sed -e 's/[\\][n]/hello/'
    

    【讨论】:

      【解决方案5】:
      1. sed 一次工作一行,因此仅在 1 行上没有 \n(它在读入缓冲区时被 sed 删除)。您应该使用NnHh 来填充超过一行的缓冲区,然后\n 出现在里面。请注意,^$ 不再是行尾,而是字符串/缓冲区的结尾,因为里面有 \n
      2. \n 在搜索模式中被识别,而不是在替换模式中。两种使用方式(示例):
        sed s/\(\n\)bla/\1blabla\1/
        sed s/\nbla/\
        blabla\
        /
        
        第一个使用 \n 已经在里面作为反向引用(替换模式中的代码更短); 第二个使用真正的换行符。

      基本上

      sed "N
      $ s/\(\n\)/\1/g
      "
      

      有效(但有点没用)。我想s/\(\n\)\n/\1/g 更像你想要的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-16
        • 2017-03-20
        • 1970-01-01
        • 2015-04-10
        • 2017-01-31
        • 2011-03-22
        • 2012-06-09
        • 1970-01-01
        相关资源
        最近更新 更多