sed 去掉所有的換行符

sed 替換所有的換行符,命令如下


echo -e "hello\nworld" | sed ':label;N;s/\n//g;b label'

  • :label; 定位標籤,用來實現跳轉處理,名字隨便取(label),後面的b label就是跳轉指令
  • N; N是sed的一個處理命令,追加文本流中的下一行到模式空間進行合併處理,設定換行符可見
  • s/\n//g; s是sed的替換命令,將換行符替換爲冒號
  • b label 或者 t label b / t 是跳轉命令,跳轉到指定標籤

上述命令不支持在 Mac 上運行(暫時沒找出原因)。下面這個可以,只是更復雜一點


echo -e "hello\nworld" | sed -n -e 'H;${x;s/\n//g;p;}'

-n 這個參數是必須的,去掉的話會輸出每行的處理結果,當然,也可以通過不加這個參數,來看這行命令是怎麼工作的
$ 表示最後一行
{...} 表示一個函數組
H; 將 pattern 空間的內容加到 hold 空間
x; 交換 pattern 空間和 hold 空間的內容
p; 將模式空間的內容輸出到標準輸出

這裏涉及到了兩個概念:模式空間(pattern space) 和 儲存空間(hold space)。大概理解就是,sed 是一行一行處理文本的,模式空間用於臨時存儲每一行處理後的文本,在“處理”的過程中,可以通過 function 把模式空間的內容先存儲到儲存空間,上面的 H 就是幹這個事的;之後又可以通過 x 等 function 把儲存空間的東西移到模式空間裏來繼續處理。

這個命令的意思就是:

  • 首先通過 H 函數把一行的文本存儲到儲存空間;
  • $ 表示只有最後一行才執行接下來的 {...} 函數組,這樣,每一行的內容就都去了儲存空間;
  • 到了最後一行,開始執行函數組,首先通過 x 函數把儲存空間的東西移到模式空間;
  • 通過 s/\n//g 這個替換函數把換行符替換掉;
  • 最後是 p 函數把模式空間的東西輸出來,結束。

這個命令也可以在 Linux 上運行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章