Linux
awk 在第一個字母后刪除多餘的空間?
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