最新のエディタ正規表現を構文に変換するにはsed?

最新のエディタ正規表現を構文に変換するにはsed?

最新のエディタ正規表現を構文に変換するにはsed

熟練した開発者ですが、完全sed初心者です。探してくれてありがとう。

  • Pop OS Linux 20.04 LTSの使用
  • VSコードでは、正規表現の入力中にリアルタイムでパターンと一致するため、正規表現を「料理」します。これは非常に便利です!
  • 私のDockerfileでXMLを編集しようとしていますsed
  • VS Codeにパターンマッチがありますが、正しいsedコマンド構文が見つからないようです。
  • 私の正規表現を3つの異なる方法で書き直しましたが、削除プロセスは機能しません。ここで欠落している概念/構文が見つかりません。

XMLの移行

<!-- HTTP Connector from upstream proxy -->
<Connector executor="tomcatConnectorThreadPool" port="8081" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
            connectionTimeout="3000" enableLookups="false" redirectPort="443" URIEncoding="UTF-8" bindOnInit="false"
            scheme="http" proxyPort="80" />

XML以降(私が追求するもの)

<!-- HTTP Connector from upstream proxy -->Hello World

私の正規表現はVSコードで動作します。

検索モード

(<!-- HTTP Connector from upstream proxy -->)(^.*)(^.*)(^.*)

交換パターン

VSコードの逆参照=$1

$1Hello World

sed失敗する

なぜこれがうまくいかないのか推測してください。

  1. 特殊文字を解釈できない少し毛深い正規表現ですか?

    sed -E 's/(<!-- HTTP Connector from upstream proxy -->\n)([<.\w="\-\s\/>]*$)/\1Hello World/g' path/to/xml.xml
    
  2. Ziziの言及は違法ですか?

    sed -E 's/(<!-- HTTP Connector from upstream proxy -->\n)((^.*\n){3})/\1Hello World/g' path/to/xml.xml
    
  3. なぜこれがうまくいかないのかわかりませんか?

    sed -E 's/(<!-- HTTP Connector from upstream proxy -->)\n(^.*)\n(^.*)\n(^.*)/\1Hello World/g' path/to/xml.xml
    

これらの正規表現を正しいsedコマンド構文で表現するにはどうすればよいですか?

答え1

問題は、複数の改行文字を一致させようとしているようです。正規表現:

(<!-- HTTP Connector from upstream proxy -->)(^.*)(^.*)(^.*)

これは私が知っている正規表現スタイルでは機能しません。 VSCode ツールは、いくつかの暗黙が^「改行全体の一致」を意味する正規表現スタイルを使用しているようです。ほとんどの*nixユーティリティは、末尾の\n文字で定義された「レコード」(行)を処理します。複数行にわたって一致させるには、いくつかのトリックが必要です。

Linuxを使用しているのでGNUがあるので、sed次のことができます。

$ sed -Ez 's/^(<!-- HTTP Connector from upstream proxy -->)\n([^\n]*\n){3}/\1Hello World\n/' file.xml 
<!-- HTTP Connector from upstream proxy -->Hello World

またはあなたの場合は短いです。

$ sed -Ez 's/^(<!--[^\n]*)\n([^\n]*\n){3}/\1Hello World\n/' file.xml 
<!-- HTTP Connector from upstream proxy -->Hello World

ここでの秘訣は、ファイル全体を読み、それを1つの「レコード」として扱う-zことです。その後、レコードの先頭でaを見つけてキャプチャし(グループをキャプチャするには括弧が必要です)、改行文字()が表示されるまで改行ではなく最長文字を一致させ、3行をさらに一致させるようにsed指示します(lineは改行文字ではなく、後に改行文字が続くことを意味します: )。<!--\1[^\n]*\n([^\n]*\n){3}

この操作では、正規表現をまったく使用せず、行番号のみを使用します。

$ sed '1s/$/Hello world!/; 2d;3d;4d' file.xml 
<!-- HTTP Connector from upstream proxy -->Hello world!

関連情報