在shell脚本中处理sed命令中的反向引用

时间:2017-10-16 18:22:16

标签: bash shell awk sed

我正在尝试在shell脚本中创建一个sed命令,该脚本在与用户交互时接受变量,但由于我在其中使用的反向引用,我无法使其工作....一些帮助.. ?

脚本:

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

然后在sed命令我尝试了这些方法:

1

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

第3

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 个答案:

答案 0 :(得分: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\"'>/来自起跑线的RegEx

{N;/<seg>/来自终点线的RegEx

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

/\1/(.*)元素的反向引用

Grep命令:

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