我知道如何在一组文件中进行搜索和替换:
perl -pi -w -e's / search / replace / g;' * .PHP
所以我可以用它来搜索关键字或短语并进行更改。但是我有一个更复杂的任务,我不知道该怎么做。
我想在我的所有php文件中进行搜索和替换,以搜索特定的关键字,并将其替换为文件名减去扩展名。
示例:在文件Mountains.php中搜索关键字树和您看到树的任何地方,将其替换为山
当然我希望能够批量执行此操作,因为几百个php文件都有不同的名称,但都包含搜索词Trees。
如果有人正在寻找额外的挑战,哈哈,如果我能做一个更复杂的场景,如......,那就更好了。
示例:在文件MountainTowns.php中搜索关键字树木以及您看到树木的任何地方,将其替换为“Mountain Towns”(请注意额外的空间,大写字母可以指示空间的位置)
感谢您的时间并考虑我的问题。
答案 0 :(得分:2)
嗯,文件名在$ ARGV中,因此没有太多工作需要。
perl -i -pe '($x=$ARGV)=~s{.php$}{};s{Trees}{$x}g' BlueMountains.php RedMountains.php
加入
$x=~s{(.)([A-Z])}{$1 $2}g;
在上传字母之前添加空格,以获得完整的
行perl -i -pe '($x=$ARGV)=~s{.php$}{};$x=~s{(.)([A-Z])}{$1 $2}g;s{Trees}{$x}g' BlueRedMountains.php
答案 1 :(得分:0)
这可能对您有用:
printf "%s\n" *.php |perl -pwe 's|(.*).php|perl -pi -we "s/Trees/$1/g;" $&|' | bash
这使用perl编写脚本来进行出价。
可以使用其他小语言,例如awk或:
printf "%s\n" *.php |sed 'h;s/\.php//;s/\B[A-Z]/ &/;G;s|\(.*\)\n\(.*\)|sed -i "s/Trees/\1/g" \2|' | bash
这使用sed为第二个请求提供解决方案。
答案 2 :(得分:-1)
您希望为每个文件单独替换,因此请为每个文件单独执行搜索并替换:
for file in *.php; do sed -i "s/foo/${file%.*}/g" "$file"; done
你的第二个请求有点困难,至少需要一个子shell。
for file in *; do sed -i "s/bar/$(echo ${file%.*} | sed 's/\(.\)\([A-Z]\)/\1 \2/')/g" "$file"; done
如果你把它放在一个脚本中,它会更具可读性:
#!/bin/bash
for file in "$@"; do
replacement=$(echo ${file%.*} | sed 's/\(.\)\([A-Z]\)/\1 \2/')
sed -i "s/bar/$replacement/g" "$file";
done
这将适用于传递它的所有参数,因此请使用./script.sh *.php
调用。