这是我在 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 http://perldoc.perl.org/perlre.html#Lookaround-Assertions)
- 我正在使用
-s
启用“基本开关解析”的选项,将 shell 变量传递到 Perl 中,而无需玩引用游戏。 (参考:http://perldoc.perl.org/perlrun.html http://perldoc.perl.org/perlrun.html)
Testing
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
Notes
- 你不应该在 shell 中使用 ALL_CAPS_VARNAMES,让 shell 保留它们。总有一天,你会用
PATH=something
然后想知道为什么你的脚本被破坏了。
-
@123的评论是有效的。这是从文件中读取行的安全方法:
while read -r file; do
perl ... "$file"
done < "$LOGI"
ref: http://mywiki.wooledge.org/DontReadLinesWithFor http://mywiki.wooledge.org/DontReadLinesWithFor
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)