2017-10-16 313 views
-1

我正在嘗試在一個shell腳本中使用一個sed命令,該腳本在與用戶交互時需要變量,但由於反向引用,我無法使其工作在它使用....一些幫助...?在shell腳本中處理sed命令中的反向引用

腳本:

echo "Origin language?\n" 
read ol 
echo "\nTarget language?\n" 
read tl 
echo "\ntmx file name?\n" 
read file 

然後在sed命令我曾嘗試以下方法:

sed -r "s/lang=\"$ol\">(.*)$/\1/g" "$file" > ${file}_${ol}.txt 
sed -r "s/lang=\"$tl\">(.*)$/\1/g" "$file" > ${file}_${tl}.txt 

2.

thisol = "<tuv xml:lang=\"$ol\">(.*)$" 
thistl = "<tuv xml:lang=\"$tl\">(.*)$" 

sed -r "s/$thisol/\1/g" "$file" > ${file}_${ol}.txt 
sed -r "s/$thistg/\1/g" "$file" > ${file}_${tl}.txt 

thisol = "<tuv xml:lang=\"$ol\">(.*)$" 
thistl = "<tuv xml:lang=\"$tl\">(.*)$" 
that = "\\\1" 

sed -r "s/$thisol/$that/g" "$file" > ${file}_${ol}.txt 
sed -r "s/$thistg/$that/g" "$file" > ${file}_${tl}.txt 
+1

你需要的,如果你使用雙引號來躲避逆向引用的括號內。如'\(。* \)'。 – tvm

+0

這是我試用過的東西之一,但我再次嘗試,但沒有再次成功...... –

+0

瞭解引用的內容:'sed -E'/ lang ='「$ ol」'>(。*) $/\ 1/g'「$ file」>「$ {file} _ $ {ol} .txt」'。 –

回答

0

基於由@EdMorton提出的意見,我可以找到這個問題的答案,我不得不修改一點點由他提出的建議,但最後我意識到這不是我所需要的,我應該用grep來完成,任何方法都是正確的代碼來完成問題隱含的內容,以及我使用的最終grep命令(我從here得知)

sed命令:

sed -r '/<tuv xml:lang='\"$ol\"'>/{N;/<seg>/{N;s/<tuv xml:lang='\"$ol\"'>\n\s+<seg>(.*)<\/seg>/\1/}}' "$file.tmx" > "${file}_${ol}.txt" 

其中:

/<tuv xml:lang='\"$ol\"'>/正則表達式從精整線

{N;s/<tuv xml:lang='\"$ol\"'>\n\s+<seg>(.*)<\/seg>搜索到的完整的正則表達式

/\1/反向引用到(.*)元件起跑線

{N;/<seg>/的正則表達式

grep命令:

grep -Pzo "<tuv xml:lang=\"$ol\">\n\s+<seg>(.*)<\/seg>" "$file.tmx" > "${file}_${ol}.txt"