1

我在 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

但这也失败了,大概是出于同样的原因。任何人都可以告诉我是否有解决此问题的方法,或者是否有一种方法可以在事先不知道其内容是什么的情况下转义整个变量?

我对此很陌生,如您所见,我只熟悉基础知识。

4

2 回答 2

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"
于 2013-06-21T18:29:05.853 回答
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"

于 2013-06-21T22:22:27.387 回答