这是我在 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
- 您的正则表达式将匹配[冒号、大于号、等号]和空格,但您不将它们包含在替换中。我使用
\K
指令来匹配这些字符,但随后忘记了它们(引用: http://perldoc.perl.org/perlre.html#Lookaround-Assertions ) - 我使用
-s
选项启用“基本开关解析”,将 shell 变量传递到 Perl 中,而无需玩引用游戏。 (引用:http://perldoc.perl.org/perlrun.html)
测试
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"
关于regex - Bash - 在 perl 正则表达式中使用变量以及匹配组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46346845/