【问题标题】:Correct way to assign regex replace to a variable in bash [duplicate]将正则表达式替换分配给bash中的变量的正确方法[重复]
【发布时间】:2019-09-15 18:24:24
【问题描述】:

我正在尝试为 bash 中正则表达式替换的结果分配一个变量。例如,当我跑步时

echo $initialvar | perl -pe 's/.+(Some_Dir\/)(.+)/\2/'

我从echo 获得了所需的输出。如何将newvar 分配给结果输出?

我试过了:

newvar= "$($initialvar | perl -pe 's/.+(Some_Dir\/)(.+)/\2/')"
newvar= echo $initialvar | perl -pe 's/.+(Some_Dir\/)(.+)/\2/'

但它们都不起作用

【问题讨论】:

  • newvar=$(perl -pe 's/.+(Some_Dir\/)(.+)/$2/' <<< "$initialvar")

标签: bash perl


【解决方案1】:

至于您的问题,它似乎包含两个挑战:一个是将运行命令的输出分配给 BASH 变量,另一个是将变量的内容通过管道传输到 Perl 程序的标准输入。

一个

foo=$(bar)

运行 bar 并将其输出保存到 BASH 变量 $foo

The other

任何一个

echo "$foo" | bar
bar <(echo "$foo")
bar <<< "$foo"

运行bar,将$foo 的内容通过管道传输到其标准输入

两者结合

baz=$(bar <<< "$foo")

$baz 设置为bar 生成的值,并将$foo 的内容发送到其标准输入。


其次,一些与您的问题外围相关的 Perl 相关建议:

我可能会改用perl -nE:

  • -n 将像-p 一样循环遍历每一行,但默认情况下不会打印。
  • -E 将像 -e 一样评估,但启用了 say 等实验性功能。

您可以避免转义 Some_Dir/ 中的斜线,方法是使用另一个分隔符,例如s!...!...!m!...!。与其替换为s//,因为您只是打印“Some_Dir/”(如果匹配),您不妨直接执行此操作:

perl -nE 'say (m!Some_Dir/! ? "Some_Dir/" : $_)'

所以:

newvar=$(perl -nE 'say (m!Some_Dir/! ? "Some_Dir/" : $_)' <<< "$initialvar")

【讨论】:

    【解决方案2】:

    您可以使用以下任一种:

    newvar=$(echo "$initialvar" | perl -pe 's/.+(Some_Dir\/)(.+)/\2/')
    newvar=`echo "$initialvar" | perl -pe 's/.+(Some_Dir\/)(.+)/\2/'`
    

    【讨论】:

    • 也许指出反引号语法已过时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多