Text-Processing
如何使用 sed 將多個空格剝離為一個?
sed
在 AIX 上沒有做我認為應該做的事情。我試圖在 IOSTAT 的輸出中用一個空格替換多個空格:# iostat System configuration: lcpu=4 drives=8 paths=2 vdisks=0 tty: tin tout avg-cpu: % user % sys % idle % iowait 0.2 31.8 9.7 4.9 82.9 2.5 Disks: % tm_act Kbps tps Kb_read Kb_wrtn hdisk9 0.2 54.2 1.1 1073456960 436765896 hdisk7 0.2 54.1 1.1 1070600212 435678280 hdisk8 0.0 0.0 0.0 0 0 hdisk6 0.0 0.0 0.0 0 0 hdisk1 0.1 6.3 0.5 63344916 112429672 hdisk0 0.1 5.0 0.2 40967838 98574444 cd0 0.0 0.0 0.0 0 0 hdiskpower1 0.2 108.3 2.3 2144057172 872444176 # iostat | grep hdisk1 hdisk1 0.1 6.3 0.5 63345700 112431123 #iostat|grep "hdisk1"|sed -e"s/[ ]*/ /g" h d i s k 1 0 . 1 6 . 3 0 . 5 6 3 3 4 5 8 8 0 1 1 2 4 3 2 3 5 4
sed 應該搜尋和替換多個空格 (/
$$ $$*/) 整個組 (/g) 有一個空格 (/ /)… 但它不僅這樣做… 它的間距每個字元。 我究竟做錯了什麼?我知道它一定很簡單… AIX 5300-06
**編輯:**我有另一台有 10 多個硬碟的電腦。我將其用作另一個程序的參數以進行監視。
我遇到的問題是“awk ‘{print $ 5}’ didn’t work because I’m using $ 1,等在二級階段,並給出了列印命令錯誤。我正在尋找一個 grep/sed/cut 版本。似乎有效的是:
iostat | grep "hdisk1 " | sed -e's/ */ /g' | cut -d" " -f 5
這
$$ $$當我認為它們的意思是“只有一個”時,s 是“0 或更多”。卸下支架使其工作。三個非常好的答案很快就很難選擇“答案”。
的使用
grep
是多餘的,sed
可以這樣做。問題在於使用*
哪個也匹配0個空格。使用 GNUsed
,您可以\+
改用:iostat | sed -n '/hdisk1/s/ \+/ /gp'
或者,使用標準
sed
:iostat | sed -e '/hdisk/!d' -e 's/ \{2,\}/ /g'
刪除所有不包含 substring 的行
hdisk
,並用單個空格替換所有兩個或多個空格的執行,或iostat | sed -e '/hdisk1/!d' -e 's/ */ /g'
/[ ]*/
匹配零個或多個空格,因此字元之間的空字元串匹配。如果您嘗試匹配“一個或多個空格”,請使用以下之一:
... | sed 's/ */ /g' ... | sed 's/ \{1,\}/ /g' ... | tr -s ' '