我希望您能够用Bash从标准输入中读取行(以便我可以将输入作为管道),然后仅删除前导和尾随空格字符。将输入导向echo不起作用。
例如,如果输入为:
12 s3c
sd wqr
输出应为:
12 s3c
sd wqr
我希望不用写 Python 脚本或类似的东西就能解决这么简单的事情。感谢任何帮助!
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/'
trim () { while read -r line; do echo "$line"; done; }
- Barak1731475your_command | xargs -L1 echo
echo
会将所有制表符转换成空格,并将多个空格转换成单个空格, 不仅限于前导和尾随的空格,例如:$ printf " 1\t\t\t2 3"
1 2 3
$ echo `printf " 1\t\t\t2 3"`
1 2 3
\
、'
和"
。| sed -r 's/\s*(.*?)\s*$/\1/'
我知道这个方法有点老,但还有另一种简单而粗暴的方法:
line=$(echo $line)
看这个例子:
user@host:~$ x=" abc "
user@host:~$ echo "+$x+"
+ abc +
user@host:~$ y=$(echo $x)
user@host:~$ echo "$y"
+abc+
grep -o -E '\S.*\S|\S'
解释:
-о
- 仅打印匹配项-E
- 使用扩展的正则表达式语法'\S.*\S'
:
sed 's/^ *//;s/ *$//'
代替呢? - Jonathan Lefflersed -r 's/ *(.*) */\1/g'
? - Michael Kopinsky\s
代替空格。 - Nakilonsed -r 's/\s*(.*)\s*/\1/'
大多数情况下可以工作,但我认为它不会修剪行尾,因为.*是贪婪的。我会尝试's/\s*(.*?)\s*$/\1/'
。基本上,这会查找任何空格直到第一个非空格,然后查找任何字符直到第一组后跟行尾的空格。至少,这是意图。 - Nathansed
不支持非贪婪模式,也可能不支持\s
。你需要像这样做:sed 's/^[\t ]*\([^\t ].*[^\t ]\)[\t ]\+$/\1/'
。请注意,Perl 支持非贪婪模式和\s
:perl -ple 's/\s*(.*?)\s*$/$1/'
。 - Dennis Williamson