在Bash中删除空行并修剪周围的空格

21

这个命令可以删除空行:

sed -e '/^$/d' file

但是,如何删除每行非空字符串开头和结尾的空格?

4个回答

42
$ sed 's/^ *//; s/ *$//; /^$/d' file.txt

`s/^ *//`  => left trim
`s/ *$//`  => right trim
`/^$/d`    => remove empty line

4
sed -r 's/^\s*//; s/\s*$//; /^$/d' - kev
sed -r "/^\s*\$/d ; s@^\s*(.*)\s*\$@\1@" - 比 sed 更简洁的写法 :) - uzsolt
1
注意OS X用户:等效的答案是 sed -E 's/^ +//; s/ +$//; /^$/d' file.txt(等效于通用的基于\s的变体是:sed -E 's/^[[:space:]]+//; s/[[:space:]]+$//; /^$/d' file.txt。(截至10.8,sed没有-r选项;-E打开扩展正则表达式,支持[[:..:]]风格的字符类,但显然不支持它们的速记等价物,如\s。) - mklement0
这可以通过接受此处的答案稍微改进:https://dev59.com/-GQn5IYBdhLWcg3w_LPx#24957725 - ConMan
使用[[:blank:]]可能比空格更好,因为它还包括制表符。 - Petr Kozelka

9

使用awk更简单的方法。

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

NF会选择非空行,并且$1=$1会去除行首和行尾的空格(并压缩行中间连续的空格)。


4
这可能适合您:
sed -r 's/^\s*(.*\S)*\s*$/\1/;/^$/d' file.txt

2
类似的,但使用 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

要进行递归替换,您可以使用新的通配符选项(例如**/*.txt)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接