Linux
vim 正常模式下的 ‘%s’ 和正常 GNU sed 有什麼區別
我對正則表達式很陌生,並認為使用正則表達式將 markdown(maardown 的自定義/製作格式)轉換為 html 將是一個很好的入門方法。當我在 Vim(8.1) 中時,說轉換這一行;
+style #include <style.css> -style
至;
<link rel="stylesheet" type="text/css" href="style.css">
我在 Vim 中使用了這個命令;
:%s/^+style$\n\(.*\)$\n^-style/<link rel="stylesheet" type="text\/css" href="\1">/g
我得到了我想要的東西。但是,當我使用 GNU sed 從終端執行相同的命令時,輸出沒有任何變化;
sed 's/^+style$\n\(.*\)$\n^-style/<link rel="stylesheet" type="text\/css" href="\1">/g'
此外,包括
-z
標誌似乎也沒有太大幫助,輸出與輸入保持相同。我不知道這是為什麼。
您的
sed
命令,正如它在問題中所代表的那樣,根本無法在其輸入中看到任何換行符,因為sed
它是一個面向行的編輯器。數據將一次顯示為sed
一行,並刪除實際的換行符。添加
-z
GNUsed
將使實用程序使用 nul (\0
) 作為其分隔符。這意味著您現在可以立即將整個文件放入sed
編輯緩衝區,並能夠使用\n
. 但是,它也意味著^
並且$
不再匹配行的開頭和結尾。就個人而言,我會使用標準
sed
命令sed '/^+style$/,/^-style$/ s|^#include.*|<link rel="stylesheet" type="text/css" href="style.css">|' file
這與您嘗試做的三件事不同:
- 它使用地址範圍,
/^+style$/,/^-style$/
,定址s///
命令應該影響的行。- 在該範圍內,替換命令
#include
在行首匹配。- 替換命令是用
|
分隔符而不是通常的分隔符編寫的,/
以允許模式和/或替換文本包含/
而不轉義它。這有助於可讀性。(它還不需要GNU
sed
。)修改後的命令也可以在 Vim 中使用,儘管您必須在那裡
/
用作s///
命令的分隔符。編輯器將ed
能夠使用相同的命令sed
。