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

问题描述:

我想要一个bash的方式来读取标准输入行(所以我可以管输入到它),并只删除前导和尾随空格字符。管道回波不起作用。如何修剪从bash上的标准输入读取的行?

例如,如果输入的是:

 12 s3c 
    sd wqr 

输出应该是:

12 s3c 
sd wqr 

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

您可以使用SED修剪它。

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

你可以做的非常轻松地测试它的命令行:

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

两个硒过程是令人不舒服的重量级。为什么不呢:'sed's/^ * //; s/* $ //''? – 2010-12-12 16:18:59

+0

这对他提供的数据有效。我给你点了! :D – phillip 2010-12-12 16:27:00

+3

为什么连'sed -r's/*(。*)*/\ 1/g''? – 2010-12-12 22:19:04

$ 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循环:

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

使用sed只有一个替代:

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

我喜欢简单的实用方法。你需要修正while语法: 'trim(){while read -r line;做回声“$行”;完成; }' – Barak1731475 2013-10-23 15:24:26

+0

@ user1731475:修正,谢谢 – 2013-10-23 15:47:30

+1

请注意,这个答案的重点是'只使用读命令,它会默认修剪'。回声的使用纯粹是为了匹配问题中'输出应该'的测试条件。要查看如何不获取请求的行为或了解为什么它可能_possible_这可能无法正常工作,请参阅[此问题](http://*.com/questions/7314044/use-bash-to-read-line-by直插式并保持的空间)。 – SensorSmith 2016-05-12 23:04:05

补充一点:
| sed -r 's/\s*(.*?)\s*$/\1/'

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

line=$(echo $line) 

看到这个例子:

[email protected]:~$ x=" abc " 
[email protected]:~$ echo "+$x+" 
+ abc + 
[email protected]:~$ y=$(echo $x) 
[email protected]:~$ echo "$y" 
+abc+ 
+0

这是坏的:如果有glob字符,并且还将连续的空格连接起来。不要提“echo”通常是一个不好的选择(例如,如果行以'-n','-e'或'-E'开头)。 – 2016-09-16 09:13:41

+0

适合我。谢谢。 – Geddon 2017-02-16 16:22:52

your_command | xargs -L1 echo 

这工作,因为echo所有tabls为空格,然后所有的多个空格转换为单个空间,不仅开头和结尾,见例如:

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

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

+2

如果有反斜杠或引号,这将失败。 – 2016-09-16 09:14:07