将大括号 {} 与 sed 匹配

将大括号 {} 与 sed 匹配

我想\includegraphics.tex文件中删除以获得文件名列表,如下例所示。我想删除xy获取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行末尾包含{字符则无效。

相关内容