我一直在遵循这里的指导: 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
我尝试了许多不同的迭代。
答案 0 :(得分:3)
有两个问题。
package=$filename
不会将输出传输到perl
package
仅设置在运行管道左侧的子shell中;在管道完成后没有设置它。如果你想要的只是文件名中第一个-
之前的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