我想\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\}
匹配前一个表达式一到四次)。这是一个基本的正则表达式运算符,并且等效的扩展正则表达式是不带反斜杠的。
在扩展正则表达式中(与 一起使用sed -E
),您做想要同时逃离{
和}
。如果您发现很难记住何时转义以及何时不转义这些字符,您可以始终在基本表达式和扩展表达式中使用[{]
和来按字面匹配它们。[}]
您还在*.
我认为您的意思的两个地方使用了.*
.顺便说一句,*
正则表达式开头的 a (或紧随其后^
)将匹配文字*
字符。
至于实际的sed
命令,我可能会使用以下命令:
sed 's/.*\\includegraphics.*{\([^}]*\)}.*/\1/' file.tex
要删除所有不包含任何\includegraphics
命令的行,您可以添加一个简单的d
命令:
sed -e '/\\includegraphics/!d' \
-e 's/.*\\includegraphics.*{\([^}]*\)}.*/\1/' file.tex
这适用于您的示例,但如果somethingelse
行末尾包含{
字符则无效。