2010-12-12 72 views
17

我想要一個bash的方式來讀取標準輸入行(所以我可以管輸入到它),並只刪除前導和尾隨空格字符。管道回波不起作用。如何修剪從bash上的標準輸入讀取的行?

例如,如果輸入的是:

 12 s3c 
    sd wqr 

輸出應該是:

12 s3c 
sd wqr 

我想避免編寫Python腳本或微不足道,因爲這類似的話。任何幫助表示讚賞!

回答

20

您可以使用SED修剪它。

sed 's/^ *//;s/ *$//' 

你可以做的非常輕鬆地測試它的命令行:

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

兩個硒過程是令人不舒服的重量級。爲什麼不呢:'sed's/^ * //; s/* $ //''? – 2010-12-12 16:18:59

+0

這對他提供的數據有效。我給你點了! :D – phillip 2010-12-12 16:27:00

+3

爲什麼連'sed -r's/*(。*)*/\ 1/g''? – 2010-12-12 22:19:04

17
$ 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;做回聲「$行」;完成; }' – Barak1731475 2013-10-23 15:24:26

+0

@ user1731475:修正,謝謝 – 2013-10-23 15:47:30

+1

請注意,這個答案的重點是'只使用讀命令,它會默認修剪'。回聲的使用純粹是爲了匹配問題中'輸出應該'的測試條件。要查看如何不獲取請求的行爲或瞭解爲什麼它可能_possible_這可能無法正常工作,請參閱[此問題](http://stackoverflow.com/questions/7314044/use-bash-to-read-line-by直插式並保持的空間)。 – SensorSmith 2016-05-12 23:04:05

3

補充一點:
| sed -r 's/\s*(.*?)\s*$/\1/'

1

我知道這是舊的,但有另一種簡單又髒方式:

line=$(echo $line) 

看到這個例子:

[email protected]:~$ x=" abc " 
[email protected]:~$ echo "+$x+" 
+ abc + 
[email protected]:~$ y=$(echo $x) 
[email protected]:~$ echo "$y" 
+abc+ 
+0

這是壞的:如果有glob字符,並且還將連續的空格連接起來。不要提「echo」通常是一個不好的選擇(例如,如果行以'-n','-e'或'-E'開頭)。 – 2016-09-16 09:13:41

+0

適合我。謝謝。 – Geddon 2017-02-16 16:22:52

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 

的缺點是它也會刪除一些有用的字符,如\'"

+2

如果有反斜槓或引號,這將失敗。 – 2016-09-16 09:14:07

相關問題