Bashで文字列操作に中括弧を使用する

Bashで文字列操作に中括弧を使用する

ラテックスファイルの文字列があり、それを処理したいと思います。

\title{This is the 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 または sum をサポートするgrep他の実装がある場合は、次のことができます。-o-P

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

関連情報