【问题标题】:Perl to substitute string with a string containing spaces and double quotesPerl 用包含空格和双引号的字符串替换字符串
【发布时间】:2015-08-25 17:43:18
【问题描述】:

我的 bash 脚本构建了一个字符串变量$arrayLMEs,其中包含如下字符串:

var availableTags=[ "01 East Bering Sea", "02 Gulf of Alaska"];

我需要将此字符串放入 javascript 代码中,以替换占位符。 我正在考虑使用类似的东西:

perl -i -pe 's/PLACEHOLDER/'"${arrayLMEs}"'/' filename

但实际上该命令会抱怨,因为在字符串中发现了双引号,这会弄乱 bash 命令,从而弄乱 perl 命令。

如何修复命令以保留空格和双引号?

【问题讨论】:

  • 在 Linux 上运行 bash 时没有发现任何问题:arrayLMEs='var availableTags=[ "01 East Bering Sea", "02 Gulf of Alaska"];';回声--PLACEHOLDER-- | perl -pe 's/PLACEHOLDER/'"${arrayLMEs}"'/' -
  • 我必须说我的字符串是生成的。所以我猜想当从一个命令传递到另一个命令时,引号碰巧被去掉了。

标签: string bash perl quotes


【解决方案1】:

使用-s 开关将变量传递给perl:

perl -spe 's/PLACEHOLDER/$var/' -- -var="$arrayLMEs" filename

-- 表示命令行参数的结束。 -var="$arrayLMEs" 使用你的 shell 变量 $arrayLMEs 的值设置一个 perl 变量。

或者,您可以使用 awk:

awk -v var="$arrayLMEs" '{sub(/PLACEHOLDER/, var)}1' filename

使用 awk 的一个很好的副作用是替换是一个简单的字符串,因此原始字符串中的元字符不会被解释。

【讨论】:

  • 很好的解释!谢谢
  • 这是一个原始的解决方案。我从没想过将-s 用于单线!
【解决方案2】:

作为记录,我找到了一个解决方法(但不如 Tom Fenech 的解决方案)。

  1. 将变量保存在文件中

    echo $arrayLMEs > tmpfile

  2. 使用sed将文件内容粘贴到目标文件中

    sed -i '/PLACEHOLDER/{ r tmpfile d }' filename

我想它是相当健壮的。缺点:强制动态创建另一个文件。

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 2021-11-23
    • 2017-08-21
    相关资源
    最近更新 更多