这是我关于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
非常感谢提前
答案 0 :(得分:4)
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
注释
PATH=something
,然后想知道为什么您的脚本已损坏。和@ 123的评论有效。这是从文件中读取行的安全方法:
while read -r file; do
perl ... "$file"
done < "$LOGI"
答案 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