Text-Processing

sed:將多餘的空格刪除到字元串之間的單個空格,同時保持前導製表符不變

  • September 26, 2018

我有一個程式碼:

1 /**             
2 a        b         c
3 **/
4 int main() {
5     int x;
6     if ( condition) {
7     return       x;
8     }
9 }

我需要將標記或字元串之間的多個空格更改為單個空格,例如在第 7 行中,但註釋(第 2 行)不應受到影響,也不應影響程式碼中的前導選項卡。所以,輸出應該是:

1 /**             
2 a        b         c
3 **/
4 int main() {
5     int x;
6     if ( condition) {
7     return x;
8     }
9 }

我嘗試使用 ’tr’:~$ tr -s " " < file但它更改了第 2 行以及將第 5 行中的前導製表符刪除到第 8 行。可以使用sed嗎?

會走多遠

sed -rn '\#/\*\*#,\#\*\/*# {p;b}; s/([^ ]) +/\1 /g; p' file

我懂了?它列印未修改的註釋行(但不能在同一行處理註釋開/關)並跳過腳本的其餘部分。對於未註釋的行,它將非空格字元後面的任何多個空格(因此行縮進超出範圍)壓縮到一個空格。

最後,這對我有用:

sed -i 's/\([a-zA-Z]\+\)\( *\)\([a-zA-Z]\+\)/\1 \3/g' $1

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