【问题标题】:How do I insert a script variable into a regex string?如何将脚本变量插入正则表达式字符串?
【发布时间】:2009-12-02 18:47:35
【问题描述】:

我正在编写一个脚本,它试图将目录名称插入到 pax 命令中,但我不确定如何使语法正确。这就是我正在尝试的,但它似乎将 $DIRNAME 视为正则表达式字符串的一部分。

DIRNAME=$(tar -tvf $1  | head -1 | sed -e 's:^.* \([^/]*\)/.*$:\1:')
pax -r -f $1 -s'/$DIRNAME\/upload\///'

谢谢!

【问题讨论】:

    标签: shell


    【解决方案1】:

    在调用 pax 时尝试使用双引号而不是单引号:

    DIRNAME=$(tar -tvf $1  | head -1 | sed -e 's:^.* \([^/]*\)/.*$:\1:')
    pax -r -f $1 -s"/$DIRNAME\/upload\///"
    

    在一些 shell(例如 bash 和 sh)中,$variables 只有在出现在双引号字符串中时才会被扩展,而不是单引号字符串。


    例如,以下脚本:

    #!/bin/sh
    
    DIRNAME=$(echo 'hello')
    echo "Single quotes around regexp:"
    echo 'hello world' | sed 's/$DIRNAME/hi/'
    
    echo "Double quotes around regexp:"
    echo 'hello world' | sed "s/$DIRNAME/hi/"
    

    生成输出:

    Single quotes around regexp:
    hello world
    Double quotes around regexp:
    hi world
    

    【讨论】:

    • 那行不通。问题是 $DIRNAME 没有回显 DIRNAME 的内容,而只是将文本字符串 $DIRNAME 本身插入到正则表达式字符串中。
    • 脚本在哪个shell中运行?重击? tcsh?
    • 对不起,我又试了一次,我得到的错误是 pax 命令,而不是 $DIRNAME 一旦我双引号它。我正在使用 bash。
    • 尝试在 -s 和它的正则表达式参数之间留一个空格
    猜你喜欢
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    相关资源
    最近更新 更多