bash 中使用大括号进行字符串操作

bash 中使用大括号进行字符串操作

我有一个来自乳胶文件的字符串,我想处理它:

\title{This is the title}

我想将“这是标题”保存在变量中,但无法删除带有大括号的子字符串,尽管我尝试转义这些子字符串。

title=`grep -F "\title" file.tex`
title=${title#\}}
title=${title%\{}

这些都不起作用,将大括号放在单引号或双引号中也不起作用。

答案1

假设这$title是字符串\title{This is the title}

title=${title#*{}
title=${title%\}}

第一个参数替换中的{不需要转义(尽管转义它不会使其不起作用),但}第二个参数中的 需要转义。在第一个中,您还需要*匹配\title字符串中的位,或者使用${title#\\title{}删除显式字符串\title{

您似乎在代码中混淆了%和,并且忘记了删除前缀字符串的替换中的 。#*


假设标题字符串不超过一行,您可以使用以下命令从文档中获取所有这些字符串

sed -n 's/.*\\title{\([^}]*\)}.*/\1/p' file

这会匹配每行的(第一个)\title{SOMETHING},并用子字符串替换整行SOMETHING。所有其他数据都将被丢弃。

答案2

如果您使用的是 bash,则可以使用其正则表达式功能:

title='\title{This is the title}'
[[ $title =~ \{(.*)\} ]] && title=${BASH_REMATCH[1]}
echo "title=$title"

title=This is the title

也就是说,假设您确实需要在 bash 中执行此操作。如果这些内容来自文件,您最好使用更适合从文件中提取和解析数据的工具,例如grepawkperltex本身。

答案3

我不会尝试在 shell 中执行此操作。只需grep在保存到变量之前解析输出:

title=$(grep -F '\title' file.tex | sed s'/.*{\(.*\)}/\1/')

或者

title=$(grep -F '\title' file.tex | awk -F'[{}]' '{print $2}')

或者,如果您有 GNUgrep或任何其他支持-o和的实现-P,您可以执行以下操作:

title=$(grep -oP '\\title\{\K[^}]+' file.tex)

相关内容