转义整个url以在regex命令中使用

时间:2013-06-21 18:10:20

标签: bash url variables escaping applescript

我在使用Applescript和shell脚本时遇到了一些麻烦。基本上,URL将被设置为variableUrl,并将其提供给shell脚本:

do shell script "cd dir; cat file | grep -v '^http' | sed 's/^/" & variableUrl & "/' > urlsxy.txt"

这不起作用 - 我的输出文件中没有任何内容。我认为,这个问题是有未转义的角色。更糟糕的是,我无法提前知道URL的外观,因此我无法设置任何方式将反斜杠放入转义中。什么时候,我只是插入虚拟文本,而不是使用variableUrl,我没有问题。例如,这可以正常工作:

do shell script "cd dir; cat file | grep -v '^http' | sed 's/^/dummytext/' > urlsxy.txt"

刚才,我也尝试将网址转换为bash变量并执行...

sed 's/^/"$BASHVAR\\/g

但这也失败了,原因可能与此相同。任何机构都可以告诉我是否有解决此问题的方法,或者是否有办法在不事先知道其内容的情况下转义整个变量?

我对此非常陌生,因为你可以看到我只熟悉基础知识。

2 个答案:

答案 0 :(得分:2)

假设您要替换此符号“^”,那么这应该有效:

sed "s/\^/`printf '%q' "${BASHVAR}"`/g"

或者,在每行的开头插入$ BASHVAR的内容:

sed "s/^/`printf '%q' "${BASHVAR}"`/g"

注意:printf语句周围的反引号(`)很重要,因为它们告诉shell执行并获得结果:

printf '%q' "${BASHVAR}"

编辑:要考虑额外的限制(请参阅本答案的评论)正斜杠可能出现在$ BASHVAR中,那么另一种解决方案是使用与正斜杠不同的字符作为sed的分隔符。两个例子:

sed "s@^@`printf '%q' "${BASHVAR}"`@g"
sed "s#^#`printf '%q' "${BASHVAR}"`#g"

答案 1 :(得分:1)

awk支持使用-v:

传递变量
v=\'\"\$'  '; awk -v v="$v" '!/^http/{print v$0}' file > urlsxy.txt

gsub的第一个参数是正则表达式,但你可以转义它或使用其他脚本语言

$ echo a. | awk -v v=. '{gsub(v,"y")}1'
yy
$ echo a. | awk -v v=\\\\. '{gsub(v,"y")}1'
ay
$ echo a. | v=. ruby -pe '$_.gsub! ENV["v"], "y"'
ay

在这种情况下,你也可以这样做:

do shell script "while IFS= read -r l; do [[ $l = http* ]] || printf %s " & quoted form of variableUrl & "\"$l\"; done < /tmp/file"