Linux

vim 正常模式下的 ‘%s’ 和正常 GNU sed 有什麼區別

  • April 18, 2021

我對正則表達式很陌生,並認為使用正則表達式將 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一行,並刪除實際的換行符。

添加-zGNUsed將使實用程序使用 nul ( \0) 作為其分隔符。這意味著您現在可以立即將整個文件放入sed編輯緩衝區,並能夠使用\n. 但是,它也意味著^並且$不再匹配行的開頭和結尾

就個人而言,我會使用標準sed命令

sed '/^+style$/,/^-style$/ s|^#include.*|<link rel="stylesheet" type="text/css" href="style.css">|' file

這與您嘗試做的三件事不同:

  1. 它使用地址範圍,/^+style$/,/^-style$/,定址s///命令應該影響的行。
  2. 在該範圍內,替換命令#include在行首匹配。
  3. 替換命令是用|分隔符而不是通常的分隔符編寫的,/以允許模式和/或替換文本包含/而不轉義它。這有助於可讀性。

(它還不需要GNU sed。)

修改後的命令也可以在 Vim 中使用,儘管您必須在那裡/用作s///命令的分隔符。編輯器將ed能夠使用相同的命令sed

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