以下の例のように、ファイル名のリストを取得するためにファイル\includegraphics
から削除したいと思います。削除してインポートし.tex
たいx
y
I
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
行の末尾に{
文字があると効果はありません。