【问题标题】:How can I replace each newline (\n) with a space using sed?如何使用 sed 将每个换行符 (\n) 替换为空格?
【发布时间】:2010-11-18 03:06:43
【问题描述】:

如何使用sed 命令将换行符(“\n”)替换为空格(“”)?

我尝试失败:

sed 's#\n# #g' file
sed 's#^$# #g' file

我该如何解决?

【问题讨论】:

  • tr 仅适用于将单个字符替换为单个字符的工作,而上面的示例显示用空格替换换行符。所以在上面的示例中, tr 可以工作.. 但以后会有所限制。
  • tr 在正确的工作工具中,因为提问者想用空格替换每个换行符,如他的示例所示。对于sed,换行符的替换是独一无二的,但tr 可以轻松完成。这是一个常见的问题。执行正则表达式替换不是由tr 而是由sed 完成的,这将是正确的工具......对于不同的问题。
  • "tr" 也可以只删除换行符 `tr -d '\n' ` 但是您可能还想删除更通用的返回 `tr -d '\012\015' `。
  • 警告:“tr”在 Linux 和旧 Solaris 机器(例如 sol5.8)之间的字符范围方面表现不同。例如:` tr -d 'a-z' ` 和 ` tr -d '[a-z]' `。为此,我建议您使用没有这种区别的“sed”。
  • @MikeS 感谢您的回答。使用echo 关注tr '\012' ' '。否则文件中的最后一个换行符也会被删除。 tr '\012' ' ' < filename; echo成功了。

标签: sed


【解决方案1】:

您也可以使用Standard Text Editor:

printf '%s\n' '%s/$/ /' '%j' 'w' | ed -s file

注意:这会将结果保存回file

与这里的大多数sed 答案一样,此解决方案的缺点是必须先将整个文件加载到内存中。

【讨论】:

    【解决方案2】:

    将此解决方案与 GNU sed 一起使用:

    sed ':a;N;$!ba;s/\n/ /g' file
    

    这将循环读取整个文件 (':a;N;$!ba),然后用空格 (s/\n/ /g) 替换换行符。如果需要,可以简单地附加其他替换。

    解释:

    1. sed 首先将第一行(不包括换行符)读入模式空间。
    2. 通过:a创建标签。
    3. 通过N 将换行符和下一行添加到模式空间。
    4. 如果我们在最后一行之前,则跳转到创建的标签$!ba$!表示不在最后一行进行。这是避免再次执行N的必要条件,如果没有更多的输入!)。
    5. 最后,替换将每个换行符替换为模式空间(即整个文件)上的一个空格。

    这是适用于 BSD 和 OS X 的 sed 的跨平台兼容语法(根据 @Benjie comment):

    sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g' file
    

    如您所见,使用sed 来解决这个原本简单的问题是有问题的。如需更简单和充分的解决方案,请参阅this answer

    【讨论】:

    • 您可以通过单独执行命令而不是用分号分隔来运行这个跨平台(即在 Mac OS X 上):sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g'
    • 好像没有去掉最后一个\n?
    • 参见上面的第 3 条。看来$!意味着不要在最后一行做,因为应该有一个最后的换行符。
    • 这是一个令人印象深刻的答案。我还觉得讽刺的是,Linux 工具应该“做好一件事”,而大多数 Linux 工具似乎都做很多事情,但效果不佳
    • echo "Hello\nWorld" | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g' 返回“Hello World”,但 echo "Hello World" | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g' 为我返回一个空字符串。我在 MacOS Big Sur 上。
    【解决方案3】:
    cat file | xargs
    

    为了完整性

    【讨论】:

    • 我对 bash 有点生疏了,但这里不需要 cat 吗? xargs < file会更好吗?
    • 你是对的,它更短,但我只是用来构建管道链
    【解决方案4】:

    这可能对你有用(GNU sed):

    sed 'H;$!d;x;:a;s/^((.).*)\2/\1 /;ta;s/.//' file
    

    H 命令将换行符添加到模式空间,然后将结果附加到保留空间。 sed 的正常流程是从每一行中删除以下换行符,因此这将在保留空间的开头引入一个换行符并复制文件的其余部分。一旦文件被放入保留空间,将保留空间与模式空间交换,然后使用模式匹配将所有原始换行符替换为空格。最后,去掉引入的换行符。

    这样做的好处是永远不会在 sed 命令中实际输入换行符。

    替代方案:

    sed 'H;$!d;x;y/\n/ /;s/.//' file
    

    或者:

    sed 'H;1h;$!d;x;y/\n/ /' file
    

    【讨论】:

      【解决方案5】:

      你也可以用这个方法:

      sed 'x;G;1!h;s/\n/ /g;$!d'
      

      说明

      x   - which is used to exchange the data from both space (pattern and hold).
      G   - which is used to append the data from hold space to pattern space.
      h   - which is used to copy the pattern space to hold space.
      1!h - During first line won't copy pattern space to hold space due to \n is
            available in pattern space.
      $!d - Clear the pattern space every time before getting the next line until the
            the last line.
      

      流程

      当第一行从输入中获取时,进行了交换,因此1 进入保持空间,\n 进入模式空间,将保持空间附加到模式空间,并执行替换并删除模式空间。

      在第二行进行交换,2 进入保持空间,1 进入模式空间,G 将保持空间附加到模式空间,h 将模式复制到其中, 进行替换并删除。此操作一直持续到达到 EOF 并打印确切的结果。

      【讨论】:

      • 但是,请注意echo 'Y' | sed 'x;G;1!h;s/\n/X/g;$!d' 会导致XY
      【解决方案6】:

      GNU sed 有一个选项-z,用于以空值分隔的记录(行)。你可以打电话:

      sed -z 's/\n/ /g'
      

      【讨论】:

      • 即使输入确实包含空值,它们也会被保留(作为记录分隔符)。
      • 如果没有空值,这不会加载整个输入吗?在这种情况下,处理数 GB 的文件可能会崩溃。
      • @Ruslan,是的,它会加载整个输入。对于多 GB 文件,此解决方案不是一个好主意。
      • 这确实是最佳的答案。其他的表达方式太扭曲了,记不住。 @JJoao 您可以将它与-u, --unbuffered 一起使用。 man 法师指出:“从输入文件中加载最少的数据并更频繁地刷新输出缓冲区”。
      • @Ruslan 如果你有一个多 GB 的文本文件,无论如何你都不想使用 sed,即使在基于行的模式下,因为 sed 在大输入时速度很慢。
      【解决方案7】:

      以前的大多数sed 命令示例在我的 Unix 机器中都不起作用,并给我错误消息:

      Label too long: {:q;N;s/\n/ /g;t q}
      

      这适用于所有 Unix/Linux 环境:

      line=$(while read line; do echo -n "$line "; done < yoursourcefile.txt)
      echo $line |sed 's/ //g' > sortedoutput.txt
      

      第一行将从文件yoursourcefile.txt 中删除所有新行并生成一行。第二个sed 命令将删除其中的所有空格。

      【讨论】:

      • “标签太长”可能意味着您使用 BSD sed 并尝试使用 GNU sed 语法。按照另一个答案的建议,尝试在标签后添加换行符。
      【解决方案8】:

      如果您不幸不得不处理 Windows 行尾,则需要删除 \r\n

      tr '\r\n' ' ' < $input > $output
      

      【讨论】:

      • 这会将[ 替换为空格,\r 替换为空格,\n 替换为空格,] 替换为空格。 tr -d '\r\n' &lt;file 将删除任何 \r\n 字符,但这也不是所要求的。 tr -d '\r' &lt;file 将删除任何 \r 字符(无论它们是否与 \n 相邻),这可能更接近于有用,并且很可能更适合 OP 的需求(仍然假设您的 tr 理解这个反斜杠符号)。
      • 谢谢,已修复。只是不要放 [],并且 tr 确实尊重 \n 和 \r 作为新行并返回。有没有 tr 没有的系统?
      • 这些天它们无处不在,但我想我还记得它们不工作的系统(可能是 HP-UX 和 AIX 和 Irix 之类的恐龙?)
      【解决方案9】:

      另一种选择:

      tr -s "[:space:]" " " &lt; filename &gt; filename2 &amp;&amp; mv filename2 filename

      tr -s 用于:

      -s, --squeeze-repeats 替换每个重复字符的序列 列在最后指定的 SET 中, 该字符只出现一次

      这使用单个空格替换文件中的所有空白序列,将结果写入新文件,然后将新文件重命名为原始名称。

      【讨论】:

        【解决方案10】:

        为什么我没有找到awk 的简单解决方案?

        awk '{printf $0}' file
        

        printf 将打印没有换行符的每一行,如果你想用空格或其他分隔原始行:

        awk '{printf $0 " "}' file
        

        【讨论】:

        • echo "1\n2\n3" | awk '{printf $0}',这对我有用。 @edi9999
        • 这是在 git bash for windows 中对我有用的唯一方法
        【解决方案11】:

        快速回答

        sed ':a;N;$!ba;s/\n/ /g' file
        
        1. :a 创建一个标签'a'
        2. N 将下一行添加到模式空间
        3. $! 如果不是最后一行ba 分支(转到)标签'a'
        4. s 替换/\n/ 正则表达式换行/ / 按空格,/g 全局匹配(尽可能多次)

        sed 将循环执行步骤 1 到 3,直到到达最后一行,使所有行都适合 sed 将替换所有 \n 字符的模式空间


        替代品

        所有替代方案,与 sed 不同,不需要到达最后一行即可开始该过程

        使用 bash,速度慢

        while read line; do printf "%s" "$line "; done < file
        

        具有 perlsed 般的速度

        perl -p -e 's/\n/ /' file
        

        tr,比sed快,只能用一个字符替换

        tr '\n' ' ' < file
        

        具有粘贴tr般的速度,只能用一个字符替换

        paste -s -d ' ' file
        

        具有 awktr 般的速度

        awk 1 ORS=' ' file
        

        "echo $( 等其他替代方法速度较慢,仅适用于小文件,需要处理整个文件才能开始处理。


        sed FAQ 5.10 的长回答

        5.10。为什么我不能使用 \n 转义符匹配或删除换行符
        顺序?为什么我不能使用 \n 匹配 2 行或更多行?

        \n 永远不会匹配行尾的换行符,因为
        在将行放入
        图案空间。要将 2 行或更多行放入模式空间,请使用
        'N' 命令或类似的命令(例如 'H;...;g;')。

        Sed 的工作原理是这样的:sed 一次读取一行,切掉
        终止换行符,将剩下的内容放入模式空间
        sed 脚本可以解决或更改它,并且当模式空间
        打印后,将换行符附加到标准输出(或文件)。如果
        用 'd' 或 'D' 完全或部分删除模式空间,
        在这种情况下添加换行符。因此,像

        这样的脚本
          sed 's/\n//' file       # to delete newlines from each line             
          sed 's/\n/foo\n/' file  # to add a word to the end of each line         
        

        将永远无法工作,因为尾随换行符已被删除之前
        线被放入模式空间。要执行上述任务,
        请改用以下脚本之一:

          tr -d '\n' < file              # use tr to delete newlines              
          sed ':a;N;$!ba;s/\n//g' file   # GNU sed to delete newlines             
          sed 's/$/ foo/' file           # add "foo" to end of each line          
        

        由于 GNU sed 以外的 sed 版本对
        模式缓冲区,这里首选 Unix 'tr' 实用程序。
        如果文件的最后一行包含换行符,GNU sed 将添加
        输出的换行符但删除所有其他行,而 tr 将
        删除所有换行符。

        要匹配两行或多行的块,有 3 个基本选择:
        (1)使用'N'命令将Next line添加到模式空间;
        (2) 至少两次使用'H'命令来追加当前行
        到保持空间,然后从保持空间中检索行
        与 x、g 或 G;或 (3) 使用地址范围(参见上文第 3.3 节)
        匹配两个指定地址之间的行。

        选择 (1) 和 (2) 会将 \n 放入模式空间中,它
        可以根据需要寻址('s/ABC\nXYZ/alphabet/g')。一个例子
        使用 'N' 删除一行行的方法出现在 4.13 节
        (“如何删除特定连续行的块?”)。这
        可以通过将删除命令更改为某事来修改示例
        其他,如 'p'(打印)、'i'(插入)、'c'(更改)、'a'(追加)、
        或“s”(替代)。

        选择 (3) 不会将 \n 放入模式空间,但它
        匹配一块连续的行,所以可能是你没有
        甚至需要 \n 才能找到您要查找的内容。由于 GNU sed
        3.02.80 版现在支持这种语法:

          sed '/start/,+4d'  # to delete "start" plus the next 4 lines,           
        

        除了传统的 '/from here/,/to there/{...}' 范围
        地址,完全可以避免使用\n。

        【讨论】:

        • tr 是个好主意,而且您的整体覆盖范围有助于获得高质量的答案。
        • +1 使用 (standard utility) paste... 和所有其他人!
        • 这个答案最好的部分是“长答案”准确地解释了该命令的工作方式和原因。
        • 这可能是我在 stackexchange 上阅读的数千个答案中最有帮助的。我需要跨行匹配多个字符。以前没有 sed 示例涵盖多行,并且 tr 无法处理多个字符匹配。 Perl 看起来不错,但没有像我预期的那样工作。如果可以的话,我会多次投票赞成这个答案。
        【解决方案12】:

        sed 旨在用于基于行的输入。虽然它可以做你需要的。


        这里更好的选择是使用tr 命令,如下所示:

        tr '\n' ' ' < input_filename
        

        或完全删除换行符:

        tr -d '\n' < input.txt > output.txt
        

        或者如果你有 GNU 版本(带有长选项)

        tr --delete '\n' < input.txt > output.txt
        

        【讨论】:

        • 我不明白为什么 sed 不能这样做。请澄清使用不同的工具。
        • Sed 是基于行的,因此很难掌握换行符。
        • Alexander:“流编辑器”是指基于行的吗?也许,这个名字令人困惑。
        • sed 处理输入的“流”,但它以换行符分隔的块来理解它。它是一个 unix 工具,这意味着它可以很好地完成一件事。一件事是“逐行处理文件”。让它做其他事情会很困难,并且有可能出现错误。这个故事的寓意是:选择正确的工具。您的许多问题似乎都采取了“我怎样才能让这个工具做一些它从未打算做的事情?”的形式。这些问题很有趣,但如果它们是在解决实际问题的过程中出现的,那么你可能做错了。
        • GNU sed 支持将“记录”分隔符更改为空字节而不是换行符。
        【解决方案13】:

        一个更短的 awk 替代方案:

        awk 1 ORS=' '
        

        说明

        awk 程序由包含条件代码块的规则组成,即:

        condition { code-block }
        

        如果省略代码块,则使用默认值:{ print $0 }。因此,1 被解释为一个真实的条件,print $0 对每一行都执行。

        awk 读取输入时,它会根据RS(记录分隔符)的值将其拆分为记录,默认情况下是换行符,因此awk 将默认逐行解析输入。拆分还涉及从输入记录中剥离RS

        现在,当打印一条记录时,ORS(输出记录分隔符)被附加到它上面,默认又是一个换行符。因此,通过将ORS 更改为空格,所有换行符都会更改为空格。

        【讨论】:

        • 我非常喜欢这个简单的解决方案,它比其他解决方案更具可读性
        • 如果更有意义的话,这可以有效地写成:awk 'BEGIN { ORS=" " } { print $0 } END { print "\n"} ' file.txt(添加一个结束换行符只是为了说明开始/结束); “1”计算为true(处理该行)和print(打印该行)。也可以在此表达式中添加条件,例如,仅处理与模式匹配的行:awk 'BEGIN { ORS=" " } /pattern/ { print $0 } END { print "\n"} '
        • 你可以做得更简单:code awk 'ORS=" "' file.txt code
        • 当像这样使用 awk 时,不幸的是,文件中的最后一个换行符也被删除了。请参阅上面的 Patrick Dark 回答关于在像`cat file |这样的子shell中使用'tr'。 echo $(tr "\012" " ") ` 可以解决问题。漂亮。
        • @Jonah:这是设置变量的另一种方式,参见例如the GNU awk manual
        【解决方案14】:

        另一个GNU sed 方法,几乎​​与Zsolt Botykai's answer 相同,但它使用sed 的不常用y音译)命令,它保存 一个字节 的代码(尾随 g):

        sed ':a;N;$!ba;y/\n/ /'
        

        人们希望ys 运行得更快,(可能以tr 的速度,快20 倍),但在GNU sed v4.2.2中,y 大约是 4%s 慢。


        更便携的BSD sed 版本:

        sed -e ':a' -e 'N;$!ba' -e 'y/\n/ /'
        

        【讨论】:

        • 使用 BSD sed y 大约快 15%。有关工作示例,请参阅 this answer
        • 另外,BSD sed 命令需要在标签后终止,所以sed -e ':a' -e 'N;$!ba' -e 'y/\n/ /' 将是要走的路。
        【解决方案15】:

        使用allow查找和替换\n

        sed -ie -z 's/Marker\n/# Marker Comment\nMarker\n/g' myfile.txt
        

        标记

        变成

        # 标记注释

        标记

        【讨论】:

          【解决方案16】:
          sed '1h;1!H;$!d
               x;s/\n/ /g' YourFile
          

          这不适用于大文件(缓冲区限制),但如果有足够的内存来保存文件,它会非常有效。 (更正H-> 1h;1!H @hilojack 的好评后)

          另一个在读取时换行的版本(更多的cpu,更少的内存)

           sed ':loop
           $! N
           s/\n/ /
           t loop' YourFile
          

          【讨论】:

          • 效率不如sed ':a;N;$!ba;s/\n/ /g'的例子。另一方面,输出有一个额外的空格字符&lt;space&gt;
          • 循环版本类似于this answer,正如我在 cmets 中指出的那样,它慢了大约 800 倍。
          • +1 用于第一个版本作为':a;N;$!ba;s/\n/ /g' 脚本的指导性替代方案。但是-1对于循环版本由于@Thor提到的原因,不要使用循环变体,它既不节省CPU也不节省内存。
          【解决方案17】:
          sed -i ':a;N;$!ba;s/\n/,/g' test.txt
          
          tr "\n" <file name>
          

          【讨论】:

            【解决方案18】:

            在某些情况下,您可以将RS 更改为其他字符串或字符。这样,\n 可用于 sub/gsub:

            $ gawk 'BEGIN {RS="dn" } {gsub("\n"," ") ;print $0 }' file
            

            shell 脚本的强大之处在于,如果您不知道如何以一种方式进行操作,您可以以另一种方式进行操作。很多时候,你需要考虑的事情比对一个简单问题的复杂解决方案还要多。

            关于 gawk 很慢......并将文件读入内存,我不知道这一点,但对我来说 gawk 似乎当时只处理一行并且非常非常快(不像某些人那么快其他的,但编写和测试的时间也很重要)。

            我处理 MB 甚至 GB 的数据,我发现的唯一限制是行大小。

            【讨论】:

              【解决方案19】:

              三件事。

              1. tr(或cat等)绝对不需要。 (GNU) sed 和 (GNU) awk 结合使用,可以完成您需要的任何文本处理的 99.9%。

              2. 流!= 基于行。 ed 是基于行的编辑器。 sed 不是。有关差异的更多信息,请参阅sed lecture。大多数人将sed 混淆为基于行的,因为默认情况下,它对简单匹配的模式匹配不是很贪心——例如,在进行模式搜索和替换一两个字符时,它默认只替换它找到的第一个匹配项(除非全局命令另有指定)。如果它是基于行而不是基于流的,甚至不会有全局命令,因为它一次只会评估行。尝试运行ed;你会注意到不同之处。 ed 非常有用,如果您想遍历特定行(例如在 for 循环中),但大多数时候您只需要 sed

              3. 话虽如此,

                sed -e '{:q;N;s/\n/ /g;t q}' file
                

                在 GNU sed 4.2.1 版中运行良好。上面的命令将用空格替换所有换行符。输入起来很丑陋而且有点麻烦,但它工作得很好。 {} 可以省略,因为它们只是出于理智的原因才包括在内。

              【讨论】:

              • 作为一个只知道sed 做基本事情的人,我不得不说这不仅仅是你可以sed 做什么,而是有多容易这是为了了解正在发生的事情。我很难使用sed,所以当我可以使用它时,我更喜欢更简单的命令。
              • 使用t q 作为条件跳转,这适用于s/\n / / 之类的模式(连接所有以空格开头的行),而无需将整个文件读入内存。转换多兆字节文件时很方便。
              • 您链接的文章并未反映您的意思
              • 这比接受的大输入答案慢了近 800 倍。这是由于在越来越大的输入上运行替代每一行。
              【解决方案20】:

              你可以使用xargs:

              seq 10 | xargs
              

              seq 10 | xargs echo -n
              

              【讨论】:

              • 为我工作:xargs &lt; file.txt
              【解决方案21】:

              在 sed 替换部分,输入反斜杠,回车进入第二行,然后以 /g' 结束:

              sed 's/>/\
              /g'
              
              [root@localhost ~]# echo "1st</first>2nd</second>3rd</third>" | sed 's/>/\
              > /g'
              1st</first
              2nd</second
              3rd</third
              
              [root@localhost ~]#
              

              【讨论】:

              • 但要注意的一点是,为了可移植性,有时在脚本中使用新行(不是 \n)是必要的。通过一些技巧,您还可以插入文字\r。我的意思是在脚本文件中插入真实字符,而不是转义。
              【解决方案22】:

              以下内容比大多数答案简单得多。此外,它正在工作:

              echo `sed -e 's/$/\ |\ /g' file`
              

              【讨论】:

              • 这是行不通的,因为它不会替换换行符,而是在每一行添加一些文本。
              【解决方案23】:

              我使用了一种混合方法来绕过换行符,方法是使用 tr 用制表符替换换行符,然后用我想要的任何内容替换制表符。在这种情况下,“
              ”因为我试图生成 HTML 中断。

              echo -e "a\nb\nc\n" |tr '\n' '\t' | sed 's/\t/ <br> /g'`
              

              【讨论】:

                【解决方案24】:

                简单易懂的解决方案

                我遇到了这个问题。关键是我需要在 BSD(Mac OS X)和 GNU(Linux 和 Cygwinsedtr 上工作的解决方案:

                $ echo 'foo
                bar
                baz
                
                
                foo2
                bar2
                baz2' \
                | tr '\n' '\000' \
                | sed 's:\x00\x00.*:\n:g' \
                | tr '\000' '\n'
                

                输出:

                foo
                bar
                baz
                

                (有尾随换行符)

                它可以在 Linux、OS X 和 BSD 上运行 - 即使没有 UTF-8 支持或使用蹩脚的终端。

                1. 使用tr 将换行符与另一个字符交换。

                  NULL\000\x00)很好,因为它不需要 UTF-8 支持,而且不太可能被使用。

                2. 使用sed匹配NULL

                3. 如果需要,请使用 tr 换回额外的换行符

                【讨论】:

                • 关于命名法的一个微妙说明:字符\000 通常称为NUL(一个L),而NULL 通常用于谈论零-指针(在 C/C++ 中)。
                【解决方案25】:

                这真的很简单......当我找到解决方案时,我真的很生气。又少了一个反斜杠。就是这样:

                sed -i "s/\\\\\n//g" filename
                

                【讨论】:

                  【解决方案26】:

                  Perl 版本按您预期的方式工作。

                  perl -i -p -e 's/\n//' file
                  

                  正如 cmets 中所指出的,值得注意的是,此编辑已到位。 -i.bak 将在替换之前为您提供原始文件的备份,以防您的 regular expression 没有您想象的那么聪明。

                  【讨论】:

                  • 请至少提及-i 没有后缀会导致无备份-i.bak 可以防止您犯一个简单而丑陋的错误(例如,忘记输入 -p 并将文件清零)。
                  • @Telemachus:这是一个公平的观点,但无论哪种方式都可以争论。我没有提到它的主要原因是OP问题中的 sed 示例没有进行备份,因此在这里似乎是多余的。另一个原因是我从未真正使用过备份功能(实际上我发现自动备份很烦人),所以我总是忘记它的存在。第三个原因是它使我的命令行变长了四个字符。无论好坏(可能更糟),我都是一个强迫性的极简主义者;我只是更喜欢简洁。我知道你不同意。我会尽我最大的努力记住在以后的备份中发出警告。
                  • @Ire_and_curses:实际上,你只是为无视我做了一个该死的好论据。也就是说,你的选择是有理由的,无论我是否同意这些选择,我当然尊重这一点。我不完全确定为什么,但最近我一直在为这个特殊的事情流泪(Perl 中的-i 标志没有后缀)。我相信我很快就会找到别的东西让我着迷。 :)
                  • 很遗憾,通过为文件名指定-,这不适用于标准输入。有没有办法做到这一点?这是我不用担心修改文件的首选方法是使用以 cat 开头的管道。
                  • @StevenLu 如果没有提供文件名,Perl 默认会从 STDIN 读取。所以你可以做例如perl -i -p -e 's/\n//' &lt; infile &gt; outfile
                  【解决方案27】:

                  带有 :a 标签的答案 ...

                  How can I replace a newline (\n) using sed?

                  ... 在 freebsd 7.2 的命令行中不起作用:

                  (回声富;回声栏)| sed ':a;N;$!ba;s/\n/ /g' sed: 1: ":a;N;$!ba;s/\n/ /g": 未使用的标签 'a;N;$!ba;s/\n/ /g' 富 酒吧

                  但是如果你将 sed 脚本放在一个文件中或使用 -e 来“构建”sed 脚本...

                  > (echo foo; 回声栏) | sed -e :a -e N -e '$!ba' -e 's/\n/ /g' 富吧

                  或者...

                  > cat > x.sed << eof
                  :a
                  N
                  $!ba
                  s/\n/ /g
                  eof
                  
                  > (echo foo; echo bar) | sed -f x.sed
                  foo bar
                  

                  也许 OS X 中的 sed 是类似的。

                  【讨论】:

                  • 一系列 -e 参数在使用 MKS 的 Windows 上为我工作!谢谢!
                  【解决方案28】:

                  这里是sed,没有缓冲区(适合实时输出)。
                  示例:在 HTML 中将 \n 替换为 &lt;br/&gt; 中断

                  echo -e "1\n2\n3" | sed 's/.*$/&<br\/>/'
                  

                  【讨论】:

                    【解决方案29】:

                    谁需要sed?这里是bash 方式:

                    cat test.txt |  while read line; do echo -n "$line "; done
                    

                    【讨论】:

                    • 赞成,我通常使用最佳答案,但是当 /dev/urandom 通过它时,sed 直到 EOF 才会打印,并且 ^C 不是 EOF。每次看到换行符时都会打印此解决方案。正是我需要的!谢谢!
                    • 那为什么不呢:echo -n `cat days.txt` From this post
                    • @Tony 因为不推荐使用反引号并且 cat 是多余的;-) 使用:echo $(
                    • 甚至不使用catwhile read line; do echo -n "$line "; done &lt; test.txt。如果子外壳有问题,可能会很有用。
                    • echo $(&lt;file)all 空格压缩到一个空格,而不仅仅是换行符:这超出了 OP 的要求。
                    【解决方案30】:
                    tr '\n' ' ' 
                    

                    是命令。

                    简单易用。

                    【讨论】:

                    • 如果您不想添加空格,请直接使用tr -d '\n'
                    猜你喜欢
                    • 2014-01-25
                    • 2015-11-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2018-05-24
                    • 2014-10-16
                    • 2014-11-27
                    • 1970-01-01
                    相关资源
                    最近更新 更多