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

don*_*llo 24 bash trim

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

例如,如果输入是:

     12 s3c  
     sd wqr
Run Code Online (Sandbox Code Playgroud)

输出应该是:

12 s3c
sd wqr
Run Code Online (Sandbox Code Playgroud)

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

phi*_*lip 27

你可以使用sed修剪它.

sed 's/^ *//;s/ *$//'
Run Code Online (Sandbox Code Playgroud)

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

echo -n "  12 s3c  " | sed 's/^ *//;s/ *$//' && echo c
Run Code Online (Sandbox Code Playgroud)

  • 两个sed进程是令人不安的重量级.为什么不:`sed's/^*//; s/*$ //'` (9认同)
  • 为什么不甚至`sed -r'/*(.*)*/\1/g'`? (3认同)
  • 所以,这就是我发现的:`sed -r's /\s*(.*)\ s*/\1 /'`将主要起作用,但我认为它不会削减线的末端,因为.*很贪心.我会尝试`/ s*(.*?)\ s*$ /\1 /'`.基本上,这会查找直到第一个非空格的任何空格,然后是第一组空格之后的任何字符,后面跟着行尾.至少,这是意图. (2认同)

Pau*_*ce. 22

$ 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..
Run Code Online (Sandbox Code Playgroud)

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

trim () { while read -r line; do echo "$line"; done; }
Run Code Online (Sandbox Code Playgroud)

sed仅使用一个替换:

sed 's/^\s*\(.*[^ \t]\)\(\s\+\)*$/\1/'
Run Code Online (Sandbox Code Playgroud)


exe*_*ook 5

your_command | xargs -L1 echo
Run Code Online (Sandbox Code Playgroud)

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

$ printf "  1\t\t\t2    3"
  1         2    3
$ echo `printf "  1\t\t\t2    3"`
1 2 3
Run Code Online (Sandbox Code Playgroud)

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

  • 如果存在反斜杠或引号,这将失败。 (2认同)