Text-Processing

如何使用 sed 將多個空格剝離為一個?

  • May 10, 2021

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個空格。使用 GNU sed,您可以\+改用:

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 ' '

引用自:https://unix.stackexchange.com/questions/19014