中かっこ{}をsedと一致させます。

中かっこ{}をsedと一致させます。

以下の例のように、ファイル名のリストを取得するためにファイル\includegraphicsから削除したいと思います。削除してインポートし.texたいxyI

something {\includegraphics[width=0.5\textwidth]{/tmp/myfile.pdf} somethingelse
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxIIIIIIIIIIIIIIIyyyyyyyyyyyyyyy

次の例は、GNU sed 4.5では機能しません。正しく一致するように中括弧を適切にエスケープする方法は?

echo "something {\includegraphics[width=0.5\textwidth]{" | sed -e "s/^*.\\includegraphics\[*.\]\{//"

答え1

逃げたり{しないでください}。そうすると、sed正規表現の反復演算子を使用しているという印象を受けます(たとえば、\{1,4\}前の式を1〜4回一致)。これは基本正規表現演算子であり、対応する拡張正規表現にはバックスラッシュはありません。

拡張正規表現(と一緒に使用sed -E)では、する{脱出したい}。これらの文字をエスケープする時期とエスケープしないでください[{][}]

また、*.。を意味すると思われる2つの場所で使用しました.*。ただし、*正規表現の先頭(または直後)はリテラル文字^と一致します。*

実際のsedコマンドはおそらく次のようになります。

sed 's/.*\\includegraphics.*{\([^}]*\)}.*/\1/' file.tex

\includegraphicsコマンドを含まないすべての行を削除するには、単純なdコマンドを追加するだけです。

sed -e '/\\includegraphics/!d' \
    -e 's/.*\\includegraphics.*{\([^}]*\)}.*/\1/' file.tex

これはあなたの例ではうまくいきますが、somethingelse行の末尾に{文字があると効果はありません。

関連情報