使用sed命令删除文本文件中所有行的前导/后续空格

10

文件1:

  hello  
  world  

如何在不使用中间文件的情况下使用sed删除此文件中的前导/尾随空格 - 使用一个命令?
当前我有的是:
sed -e 's/^[ \t]*//' a > b

对于前导空格。

sed 's/ *$//' b > c

这是用于尾随空格的。


虽然@ghostdog74的回答很好,但根据您的问题,@mouviciel的回答才是正确的。我给两个回答点了赞,但我认为@mouviciel应该被接受为正确的答案。 - Hosam Aly
您是正确的——mouviciel现在被接受了。感谢mouviciel(正确答案)和ghostdog74(提供awk指导)花费时间! - user191960
4个回答

15
你差不多理解了:

你差不多理解了:

sed -e 's/^[ \t]*//;s/[ \t]*$//' a > c

此外,在某些 sed 版本中,还有一种内联编辑的选项:
sed -i -e 's/^[ \t]*//;s/[ \t]*$//' a

3
我也会考虑匹配 \s,它是通用的“所有空格字符”。 - Matthew Scharley
它不应该是 sed -e 's/^[ \t]*//;s/[ \t]*$//' a > c 吗? - Nikos Alexandris
我仍然看到 sed -e 's/^[ \t]*//;s/[ \t]*$/' a > c 对我无效(bash 版本 4.3.30,Funtoo-Linux)。 - Nikos Alexandris
1
@NikosAlexandris - 谢谢,现在我看到了缺失的尾部斜杠。已修复。 - mouviciel

7
更简单的方法,使用awk。
awk '{$1=$1}1' file

或者
awk '{gsub(/^ +|  +$/,"")}1' file

第一个完美地工作了,而且最简单 - 我知道这不是我要求的(即sed)- 但它非常优雅 :)。现在我会研究awk。 - user191960
第一个函数不仅可以删除前导和尾随的空格,还可以删除所有多余的空格。第二个函数效果最佳。awk是一个很棒的工具。 - mouviciel
啊,我明白了,第一个空格被删除后,其他的空格也随之被删除了 - 第二个空格不需要额外的删除。 - user191960

3
perl -lape 's/^\s+|\s+$//g'

说实话,我最擅长perl正则表达式,所以我发现perl -lapesed -e更容易使用。

另外,要回答原始问题,您可以像这样让sed执行多个操作:

sed -e 's/something/something else/' -e 's/another substitution/another replacement/'

显然,您还可以将这两个替换字符串放在一个字符串中,并用分号分隔它们,如另一个答案所示。

0
请注意,在不使用中间文件的情况下,将多个过滤器连续应用于输入文件的更一般情况下,解决方案是使用管道:
sed -e 's/^[ \t]*//' a | sed -e 's/ *$//' > c

显然在这里它们不是必需的,因为一次调用sed就足够了,但如果第二个sed命令是不同的,比如uniq或sort,那么这个模式就是正确的。


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