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)

相關內容