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

标签 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 组),结果为:41580

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

提前非常感谢

最佳答案

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

关于regex - Bash - 在 perl 正则表达式中使用变量以及匹配组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46346845/

相关文章:

java - 删除文件的扩展名

linux shell sed命令

linux - 如何对字符串中的数字使用正则表达式?

perl - 混淆谜题 : Can you figure out what this Perl function does?

java - 元字符\B匹配(OCP考试)

javascript - 正则表达式替换换行符和逗号

perl - 在 perl 中实现 sha-256

perl - 我们如何使用 perl 对第 1 列和第 2 列用户数据进行排序

iphone - Objective-C 正则表达式

bash - 在 Bash 中打印作为基本拉丁语一部分的 unicode 十六进制代码作为符号