【问题标题】:Delete empty lines and trim surrounding spaces in Bash在 Bash 中删除空行并修剪周围的空间
【发布时间】:2012-01-23 16:03:16
【问题描述】:

此命令删除空行:

sed -e '/^$/d' file

但是,如何从每个非空行的开头和结尾删除空格?

【问题讨论】:

    标签: bash awk sed


    【解决方案1】:
    $ sed 's/^ *//; s/ *$//; /^$/d' file.txt
    
    `s/^ *//`  => left trim
    `s/ *$//`  => right trim
    `/^$/d`    => remove empty line
    

    【讨论】:

    • sed -r 's/^\s*//; s/\s*$//; /^$/d'
    • sed -r "/^\s*\$/d ; s@^\s*(.*)\s*\$@\1@" - less sed-"calling" :)
    • OS X 用户注意:等价的答案是sed -E 's/^ +//; s/ +$//; /^$/d' file.txt(等价于广义的、基于\s 的变体是:sed -E 's/^[[:space:]]+//; s/[[:space:]]+$//; /^$/d' file.txt。(@ 没有-r 选项OS X 上的 987654330@(截至 10.8);-E 打开扩展正则表达式,支持[[:..:]] 样式的字符类,但显然不支持它们的速记等效项,例如\s。)
    • 这可以通过这里接受的答案稍微改进:stackoverflow.com/questions/16414410/…
    • 而不是空格,使用 [[:blank:]] 可能会更好,其中还包括标签
    【解决方案2】:

    这可能对你有用:

    sed -r 's/^\s*(.*\S)*\s*$/\1/;/^$/d' file.txt
    

    【讨论】:

      【解决方案3】:

      类似,但使用 ex 编辑器:

      ex -s +"g/^$/de" +"%s/^\s\+//e" +"%s/\s\+$//e" -cwq foo.txt
      

      对于多个文件:

      ex -s +'bufdo!g/^$/de' +'bufdo!%s/^\s\+//e' +'bufdo!%s/\s\+$//e' -cxa *.txt
      

      要递归替换,可以使用a new globbing option(例如**/*.txt)。

      【讨论】:

        【解决方案4】:

        使用 awk 的更简单的方法。

        awk 'NF { $1=$1; print }' file
        

        NF 选择非空行,$1=$1 修剪前导和尾随空格(具有挤压行中间的空格序列的副作用)。

        【讨论】:

          猜你喜欢
          • 2015-12-09
          • 2013-08-21
          • 2011-07-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多