如何在bash上修剪从标准输入读取的行?

How do I trim lines read from standard input on bash?

我想要一个bash方式从标准输入读取行(所以我可以输入管道),并只删除前导和尾随空格字符。 管道回声不起作用。

例如,如果输入是:

1
2
     12 s3c  
     sd wqr

输出应该是:

1
2
12 s3c
sd wqr

我想避免编写python脚本或类似的东西,因为这是微不足道的。 任何帮助表示赞赏!


你可以使用sed修剪它。

1
sed 's/^ *//;s/ *$//'

您可以通过执行以下操作在命令行上轻松测试它:

1
echo -n"  12 s3c " | sed 's/^ *//;s/ *$//' && echo c


1
2
3
4
5
6
$ trim () { read -r line; echo"$line"; }
$ echo"   aa   bb   cc  " | trim
aa   bb   cc
$ a=$(echo"   aa   bb   cc  " | trim)
$ echo"..$a.."
..aa   bb   cc..

要使其适用于多行输入,只需添加一个while循环:

1
trim () { while read -r line; do echo"$line"; done; }

仅使用一个替换sed

1
sed 's/^\s*\(.*[^ \t]\)\(\s\+\)*$/\1/'


添加这个:
| sed -r 's/\s*(.*?)\s*$/\1/'


1
your_command | xargs -L1 echo

这是有效的,因为echo将所有tabl转换为空格,然后将所有多个空格转换为单个空格,而不仅仅是前导和尾随,请参见示例:

1
2
3
4
$ printf"  1\t\t\t2    3"
  1         2    3
$ echo `printf"  1\t\t\t2    3"`
1 2 3

缺点是它还会删除一些有用的字符,如\ ' "


我知道这是旧的,但还有另一种简单而肮脏的方式:

1
line=$(echo $line)

看这个例子:

1
2
3
4
5
6
user@host:~$ x="    abc "
user@host:~$ echo"+$x+"
+    abc  +
user@host:~$ y=$(echo $x)
user@host:~$ echo"$y"
+abc+