尝试使用正则表达式导致bash中的变量

时间:2018-04-30 15:31:51

标签: bash perl

我一直在遵循这里的指导: Extract Substring Using RegExp in Plain Bash

我似乎无法让我的代码正常运行:

这正确回应:

for filename in ./unsent_xmls/*.xml; do
    echo $filename |  perl -lne 'print $& if /(\d{4})(?=-)/'
done

但是当我尝试这个时会打印一个空结果:

for filename in ./unsent_xmls/*.xml; do
    package=$filename |  perl -lne 'print $& if /(\d{4})(?=-)/'
    echo $package
done

我尝试了许多不同的迭代。

2 个答案:

答案 0 :(得分:3)

有两个问题。

  1. package=$filename不会将输出传输到perl
  2. package仅设置在运行管道左侧的子shell中;在管道完成后没有设置它。
  3. 如果你想要的只是文件名中第一个-之前的4位数,请使用

    for filename in ./unset_xmls/*.xml; do
        [[ $filename =~ ([[:digit:]]{4})- ]] && package=${BASH_REMATCH[1]}
        echo "$package"
    done
    

答案 1 :(得分:1)

三件事:您仍然需要管道中的echo,您需要$( )来捕获管道的输出,以便您可以将其分配给变量,并且您应该使用双引号变量引用(以防止可能的解析奇怪):

for filename in ./unsent_xmls/*.xml; do
    package=$(echo "$filename" |  perl -lne 'print $& if /(\d{4})(?=-)/')
    echo "$package"
done