Linux
通過刪除空格來改變模式?
文件 :
hi hello,new york, , ,brazil site ,brazil january,month is feb , , ,indiana jones
任務:
- 如果除空格外沒有其他字元,則刪除任意兩個逗號(如 , ,)之間的所有水平空格(空格和製表符)。所以它看起來像:
hi hello,new york,,,brazil site ,brazil january,month is feb ,,,indiana jones
- 此外,刪除每個參數的任何尾隨或前導水平空格(空格和製表符),使其看起來像這樣。
最終輸出:
hi hello,new york,,,brazil site,brazil january,month is feb,,,indiana jones
注意:參數本身有空格等
hi hello
。indiana jones
它不應該受到影響,變成像hihello
orindianajones
。如果可能的話,用 awk 解決,否則 sed 也可以。我無法像這樣使用 sed 完成第一項任務:
sed -n 's/,[[:blank:]],/,,/gp' file
但我得到這個作為輸出:
january,month is feb , ,,indiana jones
sed 有三種可能性:
- 最簡單的一個(在逗號之前匹配空格字元零次或多次,在逗號之後匹配空格字元零次或多次,僅用逗號替換它 - 並且多次,因此使用
g
global選項):sed 's/ *, */,/g' file
此命令的時間: 3.056s,
perl -p -e
而不是sed
5.932s 2.[:space:]
表示所有空白字元,因此與[ \t\r\n\v\f]
. 這是 POSIX 標準:sed 's/[[:space:]]*,[[:space:]]*/,/g' file
此命令的時間: 10.365s,
perl -p -e
而不是sed
9.060s 3. 最後是帶有 的縮寫版本\s
,它代表與 Perl 語法相同[:space:]
但為Perl 的語法:sed 's/\s*,\s*/,/g' file
此命令的時間: 10.507s,
perl -p -e
而不是sed
6.126s所有這些都導致
hi hello,new york,,,brazil site,brazil january,month is feb,,,indiana jones
一個 2M 行的文件所花費的時間(包含問題範例文本 1M 次)。該文件有 97MBytes 大。
第一個命令似乎是最快的
sed
。最後一個命令在使用 perl 時是最快的,並且考慮到它不僅替換了空格,還替換了製表符、換行符等。
所以,你在問 awk:
awk '{$1=$1};gsub(" ,",",")'
這會嗎?請注意,這具有刪除逗號內數據中重複空格的副作用,這對於英語可能不是問題。