Bash - 在perl正则表达式中使用变量以及匹配组

时间:2017-09-21 14:38:24

标签: regex bash perl variables for-loop

这是我关于stackoverflow的第一篇文章,请原谅我,如果我错过了重要的事情。 我目前陷入了以下问题。目标是,根据我使用find准备的文件列表动态替换端口号。这些文件中的所有端口都以数字“4”开头,有5位数字。

现在是棘手的部分,我只替换数字#2和#3,并保持位置1,4和5.例如:

old port in file: 40380, 40381
new port in file: 41580, 40381

我正在使用Sun Solaris 5.10,因此我更喜欢使用perl进行内联替换

最后关键问题:我如何组合$ 1(组1)+ $ PIN_PINNO + $ 3(组3),以便结果为:4 15 80

NEW_PINNO=15
LOGI=$HOME/filelist.txt

# port replacement
for file in `cat $LOGI`
do
    perl -pe 's/[\:\>\=]\s*(4)(\d{2})(\d{2})\b/$1${NEW_PINNO}$3/g' $file
done

非常感谢提前

3 个答案:

答案 0 :(得分:4)

perl -pse 's/ [:>=]\s* \K (\d)\d\d(\d\d) \b/$1$pin$2/gx' -- -pin="$new_pinno" file

测试

new_pinno=15
perl -pse 's/ [:>=]\s* \K (\d)\d\d(\d\d) \b/$1$pin$2/gx' -- -pin="$new_pinno" <<END
var1=40380
var2=40381
END
var1=41580
var2=41581

注释

  • 你不应该在shell中使用ALL_CAPS_VARNAMES,留下shell保留的那些。有一天,您将使用PATH=something,然后想知道为什么您的脚本已损坏。
  • 和@ 123的评论有效。这是从文件中读取行的安全方法:

    while read -r file; do
        perl ... "$file"
    done < "$LOGI"
    

    参考:http://mywiki.wooledge.org/DontReadLinesWithFor

答案 1 :(得分:0)

perl -pe 's/[\:\>\=]\s*(4)(\d{2})(\d{2})\b/$1'${NEW_PINNO}'$3/g' $file

还可以。

答案 2 :(得分:-1)

单引号和双引号之间的区别在于bash如何处理其变量。在单引号中它不会扩展它们,但当用双引号括起来时它会。你可以打开&amp;在命令行参数中尽可能多地关闭引号。只有在一对引号(单引号或双引号)之外的空格确定新参数的开始时才会这样。

因此,您关闭单引号,使用将扩展的bash变量,然后重新打开单引号。将变量括在双引号中可确保如果变量中有任何空格,则它们不会拆分参数。

perl -pe 's/[\:\>\=]\s*(4)(\d{2})(\d{2})\b/$1'"${NEW_PINNO}"'$3/g' $file