![bash 中使用大括号进行字符串操作](https://linux22.com/image/170591/bash%20%E4%B8%AD%E4%BD%BF%E7%94%A8%E5%A4%A7%E6%8B%AC%E5%8F%B7%E8%BF%9B%E8%A1%8C%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%93%8D%E4%BD%9C.png)
我有一个来自乳胶文件的字符串,我想处理它:
\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 中执行此操作。如果这些内容来自文件,您最好使用更适合从文件中提取和解析数据的工具,例如grep
、awk
、perl
或tex
本身。
答案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)