私が作業したい 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
ます。perl
tex
答え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)