Linux

awk 在第一個字母后刪除多餘的空間?

  • January 3, 2018

awk 在第一個字母后刪除多餘的空間?

我們的文件包含:

Blue    sky.    Nice       weather.
   White cloud.    Bright    sun.
       Cool air. Bla    bla          bla.

如何擁有這樣的內容:

Blue sky. Nice weather.
   White cloud. Bright sun.
       Cool air. Bla bla bla.

此命令awk '{$1=$1} 1' file刪除所有多餘的空格。

但我們只需要刪除第一個字母后的多餘空格。

有人知道嗎?

我們感謝您的關注!

使用 GNU awk 你可以:

awk '{match($0,/(^[ ]+)/,arr)}; {$1=$1;printf("%s%s\n", arr[1], $0)}' 

match($0, /(^[ ]+)/, arr)擷取行前導空格。

$1=$1刪除所有前導和重複的空格。

printf("%s%s\n", a[1], $0)}重新添加前導空格並列印。

如果您正在執行 Linux 並擁有 GNU Sed,則可以在ubstitute 命令中使用該g標誌和一個數字:s

sed -r 's/ +/ /g2' file.txt

引用info sed

Note: the POSIX standard does not specify what should happen when
you mix the `g' and NUMBER modifiers, and currently there is no
widely agreed upon meaning across `sed' implementations.  For GNU
`sed', the interaction is defined to be: ignore matches before the
NUMBERth, and then match and replace all matches from the NUMBERth
on.

但是由於在一種情況下您確實希望在空格的第一個實例上進行替換(當沒有前導空格時),所以完整的答案(使用 GNU Sed)是:

sed -r 's/^/ /;s/ +/ /g2;s/^ //' file.txt

換句話說,為所有行添加一個前導空格,然後“擠壓”除第一個之外的所有連續空格實例,然後刪除添加的前導空格。


如果您的前導空格始終是 8 的倍數,那麼您可以改用以下符合 POSIX 的命令:

unexpand file.txt | sed 's/  */ /g' | expand

或者更簡單地說:

unexpand file.txt | tr -s ' ' | expand

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