如何修剪从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
$ 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/'
我喜欢简单的实用方法。你需要修正while语法: 'trim(){while read -r line;做回声“$行”;完成; }' – Barak1731475 2013-10-23 15:24:26
@ user1731475:修正,谢谢 – 2013-10-23 15:47:30
请注意,这个答案的重点是'只使用读命令,它会默认修剪'。回声的使用纯粹是为了匹配问题中'输出应该'的测试条件。要查看如何不获取请求的行为或了解为什么它可能_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+
这是坏的:如果有glob字符,并且还将连续的空格连接起来。不要提“echo”通常是一个不好的选择(例如,如果行以'-n','-e'或'-E'开头)。 – 2016-09-16 09:13:41
适合我。谢谢。 – 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
的缺点是它也会删除一些有用的字符,如\
'
"
。
如果有反斜杠或引号,这将失败。 – 2016-09-16 09:14:07
两个硒过程是令人不舒服的重量级。为什么不呢:'sed's/^ * //; s/* $ //''? – 2010-12-12 16:18:59
这对他提供的数据有效。我给你点了! :D – phillip 2010-12-12 16:27:00
为什么连'sed -r's/*(。*)*/\ 1/g''? – 2010-12-12 22:19:04