[英]How do I trim lines read from standard input on 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/'
添加這個:
| sed -r 's/\\s*(.*?)\\s*$/\\1/'
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
缺點是它還會刪除一些有用的字符,如\\
'
"
。
我知道這很舊,但還有另一種簡單而骯臟的方法:
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'
:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.