从命令行构造perl命令参数

时间:2014-08-04 16:04:37

标签: bash perl

我想动态地向perl添加多个-e command,但它会抛出多个这样的错误:

  

找到运算符预期在-e第2行附近的字符串   “'s / \ $ testName / \ $ test-name / g;'”(缺少分号   前一行?)

继续我正在做的事情:

find css -name "*.scss" -print0 | \
xargs -0 -t perl -pi \
$(perl -ne '/^(\$(?=[a-z0-9]*[A-Z])[^:\s]+)\s*:/ && print "-e \047s/\\$1/\\" . lc(join("-", split(/(?=[A-Z])/, $1))) . "/g;\047\n"' _variables.scss | sort -ur | tr "\n" " ")

命令$(perl -ne ...)提取并转换某些内容并输出如下内容:

-e 's/\$testName/\$test-name/g;' -e 's/\$coolName/\$cool-name/g;' -e 's/\$camelCased/\$camel-cased/g;'

据我所知,问题在于bash / perl评估最后一个命令的方式,“xargs -t”手动执行命令输出工作正常。

以下简单案例也失败了:

target="-e 's/\$testName/\$test-name/g;' -e 's/\$coolName/\$cool-name/g;' 's/\$camelCased/\$camel-cased/g;'"
perl -pi $target css/core.scss

3 个答案:

答案 0 :(得分:1)

试试这个:

ARGS=$(perl -ne '/^(\$(?=[a-z0-9]*[A-Z])[^:\s]+)\s*:/ && print "-e \047s/\\$1/\\" . lc(join("-", split(/(?=[A-Z])/, $1))) . "/g;\047\n"' _variables.scss | sort -ur | tr "\n" " ")
eval "find css -name '*.scss' -print0 | xargs -0 -t perl -pi $ARGS"

或者

eval "find css -name '*.scss' -print0 | xargs -0 -t perl -pi $(perl -ne '/^(\$(?=[a-z0-9]*[A-Z])[^:\s]+)\s*:/ && print "-e \047s/\\$1/\\" . lc(join("-", split(/(?=[A-Z])/, $1))) . "/g;\047\n"' _variables.scss | sort -ur | tr "\n" " ")"

答案 1 :(得分:0)

您需要在eval中添加xargs以获取要解析的变量作为参数。这是一个快速演示:

# Variable containing parameters
> target="-e 's/a/b/g;' -e 's/x/y/g;'"

# Variable substitution - Doesn't work
> echo "aaaabbbbccccddddxxxx" | perl -pi ${target}
String found where operator expected at -e line 2, near "'s/x/y/g;'"
        (Missing semicolon on previous line?)
syntax error at -e line 2, near "'s/x/y/g;'"
Execution of -e aborted due to compilation errors.

# Manual substitution - Works
> echo "aaaabbbbccccddddxxxx" | perl -pi -e 's/a/b/g;' -e 's/x/y/g;'
bbbbbbbbccccddddyyyy

# Eval substitution - Works
> echo "aaaabbbbccccddddxxxx" | eval perl -pi ${target}
bbbbbbbbccccddddyyyy

在您的情况下,以下情况应该有效:

find css -name "*.scss" -print0 | \
    xargs -0 -t eval perl -pi $(perl -ne .....)

答案 2 :(得分:0)

您不会在变量扩展和命令替换的结果中删除引用。

有关详细信息,请参阅http://mywiki.wooledge.org/BashFAQ/050

你无法按照你想要的方式得到你想要的东西。将内部perl的结果存储在一个数组中,并在外部perl命令上展开它。