【问题标题】:escaping entire urls for use in regex commands转义整个 url 以在正则表达式命令中使用
【发布时间】:2013-06-18 23:12:29
【问题描述】:

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

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

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

【问题讨论】:

    标签: bash url variables escaping applescript


    【解决方案1】:

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

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

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

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

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

    printf '%q' "${BASHVAR}"
    

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

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

    【讨论】:

    • 不走运。我实际上是想在每一行的开头插入 $BASHVAR 。我试过 'sed -i.bak "s/^/printf '%q' ${BASHVAR}/"' 但我所有的结果都是:printf %q ${BASHVAR}/search.php printf %q ${BASHVAR}register.php?ref=notice_debate
    • 您缺少反引号“`”。
    • 好的,差不多了。当我完全执行您的脚本时,我得到: 'sed: 1: "s/^/studentr ...": bad flag in substitution command: '/'' 。如果我从变量中取出正斜杠,则输出有效。因此,似乎没有转义正斜杠。有什么建议吗?
    • 我不知道这是怎么回事,但是伙计,你是我的英雄。这一直让我发疯。如果您想将此作为答案发布,我会给您打勾。
    • 您还必须在 %q 之后引用变量以防止分词。
    【解决方案2】:

    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"

    【讨论】:

    • 非常感谢。几周前我刚开始学习,发现自己在 sed 中做所有可能的事情只是因为我理解它。有了你的例子,我真的可以开始扩展了。
    猜你喜欢
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多