最新のエディタ正規表現を構文に変換するには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
失敗する
なぜこれがうまくいかないのか推測してください。
特殊文字を解釈できない少し毛深い正規表現ですか?
sed -E 's/(<!-- HTTP Connector from upstream proxy -->\n)([<.\w="\-\s\/>]*$)/\1Hello World/g' path/to/xml.xml
Ziziの言及は違法ですか?
sed -E 's/(<!-- HTTP Connector from upstream proxy -->\n)((^.*\n){3})/\1Hello World/g' path/to/xml.xml
なぜこれがうまくいかないのかわかりませんか?
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!