bash で中括弧を使って文字列を操作する

bash で中括弧を使って文字列を操作する

私が作業したい LaTeX ファイルの文字列があります:

\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%\}}

最初のパラメータ置換の{はエスケープする必要はありません (エスケープしても機能しなくなるわけではありません) が、}2 番目の はエスケープする必要があります。最初の では、さらに文字列内の ビット*を一致させる必要があります。または、明示的な文字列を削除するには を使用します。\title${title#\\title{}\title{

コード内で%と が混同されているようですが、プレフィックス文字列を削除する置換で を忘れています。#*


タイトル文字列が1行を超えないと仮定すると、文書からそれらの文字列をすべて取得するには、

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ます。perltex

答え3

grepこれをシェルで実行しようとはしません。変数に保存する前に、出力を解析するだけです。

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

または

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

あるいは、GNU 、または とをgrepサポートするその他の実装がある場合は、次のように実行できます。-o-P

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

関連情報