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 上運行。