Nic*_*ick 1 regex bash perl grep replace
尝试perl使用bash脚本中的命令在多个文件中搜索和替换密码变量和特殊字符.到目前为止,我有:
grep -rlF "${old_pass}" | xargs perl -p -e "s~\Q$old_pass~\E$new_pass~g"
Run Code Online (Sandbox Code Playgroud)
它适用于大多数情况,但有时会失败.例如,给定old_pass=*DGB9Twq7WTwz@wR和new_pass=tDx6U&ShRv}E3Mdb上面的命令导致tDx6U&ShRv}E3Mdb@wR而不是仅仅tDx6U&ShRv}E3Mdb.
请注意,密码是自动生成的,可以包含所有大写和小写字母,数字和所有特殊字符.因此,工作版本必须能够考虑(转义)所有可能的密码版本.
您尝试并且无法生成正确的Perl代码.但真正的问题是你首先尝试从shell生成Perl代码.在不使用STDIN或外部存储的情况下,有三种主要方法可以将信息传递给Perl.
参数
perl -pe'BEGIN { ($o,$n)=splice(@ARGV,0,2) } s/\Q$o/$n/g' -- "$old_pass" "$new_pass"
Run Code Online (Sandbox Code Playgroud)命令行选项
在完整的程序中,你使用Getopt :: Long,但perl -s在这里会很好.
perl -spe's/\Q$o/$n/g' -- -o="$old_pass" -n="$new_pass" --
Run Code Online (Sandbox Code Playgroud)环境变量
O="$old_pass" N="$new_pass" perl -pe's/\Q$ENV{O}/$ENV{N}/g' --
Run Code Online (Sandbox Code Playgroud)
(在你的情况下,你必须设置env变量xargs而不是perl它自己.)
顺便说一句,你应该进一步限制你的正则表达式模式匹配.就目前而言,你可能会有误报.(匹配错误的用户密码.匹配密码的一部分.匹配完全不是密码的东西.)