【问题标题】:Delete last line break using sed [duplicate]使用 sed 删除最后一个换行符 [重复]
【发布时间】:2018-11-06 14:56:15
【问题描述】:

如何从文件中删除最后一个\n。该文件有一个最后一个空白行,用于在最后一个文本行中的换行符。我正在使用这个命令:

sed '/^\s*$/d'

但是那个 las 空行没有被删除。

【问题讨论】:

  • 您的 sed 可能无法理解 \s。改用 POSIX 字符类 [[:blank:]]
  • delete the last \n from a file - 如果最后一行为空,您是要删除最后一行还是要从最后一行删除\n 字符,无论它是否为空..
  • 给新手的建议:如果一个答案解决了您的问题,请点击旁边的大复选标记 (✓) 接受它,也可以选择投票(投票至少需要 15 个声望)点)。如果您发现其他答案有帮助,请给他们投票。接受和投票有助于未来的读者。请看【相关帮助中心文章】[1] [1]:stackoverflow.com/help/someone-answers

标签: linux unix sed file-manipulation end-of-line


【解决方案1】:

您还可以使用sed 中的以下单行来删除尾随空行:

sed -e :a -e '/^\n*$/N;/\n$/ba'

【讨论】:

    【解决方案2】:

    为什么sed 打印换行符?

    当你阅读sed POSIX standard时,它会说:

    每当将模式空间写入标准输出或命名文件时,sed 应立即在其后面加上 <newline>

    更多细节可以在this answer找到。

    删除最后一个<newline>

    • truncate:如果你只想从文件中删除一个字符,你可以这样做:

      truncate -s -1 <file>
      

      这会使文件缩短一个字节,即删除最后一个字符。

      来自 man resize-s, --size=SIZE通过SIZE字节设置或调整文件大小

      SIZE 也可以以下列修饰字符之一作为前缀: '+' 扩展,'-' 减少,'&lt;' 最多,'&gt;' 至少, '/' 向下舍入为的倍数,'%' 向上舍入为的倍数。

    • 其他答案可见How can I delete a newline if it is the last character in a file?

    【讨论】:

      【解决方案3】:

      您的问题不清楚,但这可能是您的要求:

      $ cat file
      a
      b
      c
      
      $ awk 'NR>1{print p} {p=$0}' file
      a
      b
      c
      $
      

      【讨论】:

      • 感谢您的 awk 解决方案! +1!
      【解决方案4】:

      1) 从文件中删除最后一个空行:

      首先,您当前使用的命令将删除 ALL 空行和空白行!

      不只是最后一个。

      如果你想删除最后一行,如果它是空的,那么你可以使用以下命令:

      sed '${/^[[:blank:]]*$/d}' test
      

      输入:

      cat -vTE test                                                                                                                  
      a$
      $
      b$
      $
      c$
      ^I ^I $
      

      输出:

      sed '${/^[[:blank:]]*$/d}' test                                                                                                
      a
      
      b
      
      c
      

      说明:

      • 第一个$ 将告诉sed 只在最后一行进行处理
      • /^[[:blank:]]*$/ 条件将由 sed 评估,如果此行为空或仅由空白字符组成,它将触发模式缓冲区上的删除操作,因此不会打印最后一行
      • 您可以重定向 sed 命令的输出以将其保存到新文件或使用 -i 选项就地进行更改(如果您使用它,请备份您的文件!!!!!! ) 或使用-i.bak 强制sed 在修改之前备份您的文件。

      重要提示:

      如果您的文件来自 Windows 并包含一些回车符 (\r),则此 sed 命令将不起作用!!!您需要使用dos2unixtr -d '\r' 删除那些嘈杂的字符。

      对于包含回车符&lt;CR&gt;\r^M)的文件:

      修复文件之前:

      猫:

      cat -vTE test 
      a$
      $
      b$
      $
      c$
      ^I ^I ^M$
      

      od:

      od -c test 
      0000000   a  \n  \n   b  \n  \n   c  \n  \t      \t      \r  \n
      0000016
      

      sed:

      sed '${/^[[:blank:]]*$/d}' test                                                                                                
      a
      
      b
      
      c
      

      修复文件后:

      dos2unix test 
      dos2unix: converting file test to Unix format ...
      

      猫:

      cat -vTE test                                                                                                                  
      a$
      $
      b$
      $
      c$
      ^I ^I $
      

      od:

      od -c test 
      0000000   a  \n  \n   b  \n  \n   c  \n  \t      \t      \n
      0000015
      

      sed:

      sed '${/^[[:blank:]]*$/d}' test                                                                                                
      a
      
      b
      
      c
      

      2) 从文件中删除最后一个 EOL 字符:

      为此,我建议使用perl

      perl -pe 'chomp if eof' test
      a
      
      b
      
      c
      

      您可以将-i 选项添加到更改in-place(在运行命令之前备份您的文件)。最后但并非最不重要的一点是,您可能必须按照此处所述从文件中删除回车。

      【讨论】:

        猜你喜欢
        • 2012-10-14
        • 2017-03-14
        • 1970-01-01
        • 2016-07-13
        • 1970-01-01
        • 1970-01-01
        • 2012-11-07
        • 2018-06-04
        • 1970-01-01
        相关资源
        最近更新 更多