[英]Dealing with backreference in a sed command inside a shell script
我正在尝试在 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
根据@EdMorton 的评论,我可以找到这个问题的答案,我不得不稍微修改一下他提出的建议,但最后我意识到这不是我需要的,我应该这样做grep,这里的任何方式都是完成问题所暗示的正确代码,以及我使用的最终 grep 命令(我从这里学到的)
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>
搜索到的完整正则表达式
/\\1/
对(.*)
元素的反向引用
grep 命令:
grep -Pzo "<tuv xml:lang=\"$ol\">\n\s+<seg>(.*)<\/seg>" "$file.tmx" > "${file}_${ol}.txt"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.