テキスト文字列を置き換え、その間の内容をキャプチャします。

テキスト文字列を置き換え、その間の内容をキャプチャします。

LaTeXドキュメントを編集していますが、 '\parallel'のすべてのインスタンスを 'something'\parallel something \parallelに変更する必要がある\norm{something}場合があります。 '\parallel' と 'something' の間にスペースはありません。使ってみよう

$ sed -i 's/\\parallel[.*]\\parallel/\\norm\{\1\}/g' a.txt  $

ただし、「無効な参照」エラーが返されます。正しいコードは何ですかsed

答え1

これを行うとき:

$ sed -i 's/\\parallel[.*]\\parallel/\\norm\{\1\}/g' a.txt

、キャプチャグループを使用していません。

[]指定した文字クラスから。文字クラスは、それらの1つに置き換えることができるいくつかの記号です。したがって、REは[.*]「文字列」ではなく正確に一致するのと同じです。.*

キャプチャグループはで表示されます\(RE\)。したがって、以下のよう[]に変更する必要があります。\(\)

$ sed -i 's/\\parallel\(.*\)\\parallel/\\norm{\1}/g' a.txt

経由でアクセスできます\1

答え2

sed -i -e 's/\\parallel\s\+\(.*\S\)\s*\\parallel/\\norm {\1}/g' a.txt

\1代替文字列の内容は、検索パターンの最初の\(...を参照します。\)

「拡張された」正規表現構文を好む場合

sed -i -r -e 's/\\parallel\s+(.*\S)\s*\\parallel/\\norm \{\1\}/g' a.txt

答え3

変える:

$ sed -i 's/\\parallel[.*]\\parallel/\\norm\{\1\}/g' a.txt $

これで:

$ sed -i 's/\\parallel\(.*\)\\parallel/\\norm\{\1\}/g' a.txt

それがうまくいくでしょう。

答え4

私は何を知らなかったのかわからず、[:alnum:]を使用しました。

sed -r 's#\\parallel[ ]*([[:alnum:]]+)[ ]*\\parallel#\\norm{\1}#g'

関連情報