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

Bash 转义整个URL以在regex命令中使用,bash,url,variables,escaping,applescript,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的外观,因此我无法设置任何

我在用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"
刚才,我还尝试将url转换为bash变量并执行

sed 's/^/"$BASHVAR\\/g
但这也失败了,原因大概相同。有谁能告诉我这个问题是否有解决方法,或者是否有一种方法可以在不事先知道变量内容的情况下转义整个变量


我对这一点很陌生,正如你所看到的,我只熟悉基本知识。

假设你想替换这个符号“^”,那么这应该可以:

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"

awk支持使用-v传递变量:

v=\'\"\$'  '; awk -v v="$v" '!/^http/{print v$0}' file > urlsxy.txt
gsub的第一个参数是regex,但您可以转义它或使用其他脚本语言

$ 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”而IFS=read-rl;do[[$l=http*]| | | printf%s”&变量URL的引用形式&“\$l\”完成

不走运。我实际上是想在每行的开头插入$BASHVAR。我尝试了“sed-I.bak”s/^/
printf'%q'${BASHVAR}
/”,但我所有的结果都是:
printf%q${BASHVAR}
/search.php
printf%q${BASHVAR}
register.php?ref=注意,您缺少了反勾“`”。好的,差不多了。当我完全执行脚本时,我会得到:'sed:1:“/^/..”:替换命令中的错误标志:'/''。如果我将正向斜杠从变量中去掉,那么输出就会起作用。因此,向前猛砍似乎并没有逃脱。有什么建议吗?我不知道这是怎么回事,但是老兄,你是我的英雄。这让我快发疯了。如果你想将此作为答案发布,我会给你一个大勾号。你还必须在%q之后引用变量以防止分词。非常感谢。我几周前刚开始学习,发现自己在sed中做了所有可能的事情,只是因为我理解它。有了你的例子,我真的可以开始拓展了。