如何在Bash中剪裁从标准输入读取的行?

32

我希望您能够用Bash从标准输入中读取行(以便我可以将输入作为管道),然后仅删除前导和尾随空格字符。将输入导向echo不起作用。

例如,如果输入为:

     12 s3c  
     sd wqr

输出应为:

12 s3c
sd wqr

我希望不用写 Python 脚本或类似的东西就能解决这么简单的事情。感谢任何帮助!

6个回答

47
你可以使用sed来剪辑它。
sed 's/^ *//;s/ *$//'

你可以通过在命令行中执行以下操作,轻松测试它:

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

10
两个sed进程会使程序过于笨重。为什么不用 sed 's/^ *//;s/ *$//' 代替呢? - Jonathan Leffler
3
为什么不甚至使用 sed -r 's/ *(.*) */\1/g' - Michael Kopinsky
1
在TAB的情况下使用\s代替空格。 - Nakilon
3
所以,这是我找到的:sed -r 's/\s*(.*)\s*/\1/'大多数情况下可以工作,但我认为它不会修剪行尾,因为.*是贪婪的。我会尝试's/\s*(.*?)\s*$/\1/'。基本上,这会查找任何空格直到第一个非空格,然后查找任何字符直到第一组后跟行尾的空格。至少,这是意图。 - Nathan
sed 不支持非贪婪模式,也可能不支持 \s。你需要像这样做:sed 's/^[\t ]*\([^\t ].*[^\t ]\)[\t ]\+$/\1/'。请注意,Perl 支持非贪婪模式和 \sperl -ple 's/\s*(.*?)\s*$/$1/' - Dennis Williamson
显示剩余2条评论

25
$ 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; do echo "$line"; done; } - Barak1731475
1
请注意,本答案的重点是“只需使用read命令,它将默认修剪”。使用echo仅是为了匹配问题中的“输出应该是”的测试条件。要了解如何不获得所请求的行为或理解为什么可能无法正常工作,请参见此问题。 - SensorSmith

5
your_command | xargs -L1 echo

这能够实现是因为echo会将所有制表符转换成空格,并将多个空格转换成单个空格, 不仅限于前导和尾随的空格,例如:
$ printf "  1\t\t\t2    3"
  1         2    3
$ echo `printf "  1\t\t\t2    3"`
1 2 3

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

2
如果存在反斜杠或引号,这将失败。 - gniourf_gniourf

4
加入以下文本:
| sed -r 's/\s*(.*?)\s*$/\1/'

4

我知道这个方法有点老,但还有另一种简单而粗暴的方法:

line=$(echo $line)

看这个例子:

user@host:~$ x="    abc  "
user@host:~$ echo "+$x+"
+    abc  +
user@host:~$ y=$(echo $x)
user@host:~$ echo "$y"
+abc+

这段代码有问题:如果存在通配符,它将失败,并且还会连接连续的空格。更不用说“echo”通常是一个糟糕的选择(例如,如果行以“-n”,“-e”或“-E”开头)。 - gniourf_gniourf
可以用。谢谢。 - Geddon

1
grep -o -E '\S.*\S|\S'

解释:

  • - 仅打印匹配项
  • -E - 使用扩展的正则表达式语法
  • '\S.*\S'
    • 匹配第一个非空格符号,然后贪婪地匹配任意数量的任意符号,然后匹配一个非空格符号
    • 或者,如果第一部分没有匹配(即没有两个非空格符号),则匹配单个非空格符号

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