vim 通常モードの「%s」と一般 GNU sed の違いは何ですか

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フラグを含めることはあまり役に立たないようです。出力は入力と同じままです。

理由がわからない。

ベストアンサー1

質問に示すように、コマンドは行中心エディタなので、sed入力で改行をまったく表示できません。データは、実際の改行文字が削除された状態で一度に1行ずつsed表示されます。sed

-zGNUを使用して追加すると、sedユーティリティは\0区切り文字としてnul()を使用します。これはあなたが今得ることを意味しますみんな文書をすぐにsed編集バッファに入れて使用できます\n。ただし、これは開始と終了が一致しないことを^意味します。$ワイヤーもう。

個人的に私は標準sedコマンドを使用します

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

これは、実行したいものとは異なる3つのことを行います。

  1. /^+style$/,/^-style$/これは、コマンドが影響を与える行を指定するためにアドレス範囲を使用しますs///

  2. この範囲内で、代替コマンドは行#includeの先頭で一致します。

  3. 置換コマンドは、パターンや代替テキストをエスケープなしで含めることができるように、通常の区切り文字の代わりに区切り|文字を使用して作成されます。これは読みやすさに役立ちます。//

(またそうではありません。必要グヌsed。 )

/変更されたコマンドはVimでも使用できますが、Vimでコマンドを区別する目的で使用する必要がありますs///。エディタはed同じコマンドを使用できますsed

おすすめ記事