我有一個來自乳膠文件的字串,我想處理它:
\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)