Linux提示根据文件名更改文件中的内容

时间:2012-03-06 21:36:48

标签: linux perl replace

我知道如何在一组文件中进行搜索和替换:

perl -pi -w -e's / search / replace / g;' * .PHP

所以我可以用它来搜索关键字或短语并进行更改。但是我有一个更复杂的任务,我不知道该怎么做。

我想在我的所有php文件中进行搜索和替换,以搜索特定的关键字,并将其替换为文件名减去扩展名。

示例:在文件Mountains.php中搜索关键字树和您看到树的任何地方,将其替换为山

当然我希望能够批量执行此操作,因为几百个php文件都有不同的名称,但都包含搜索词Trees。

如果有人正在寻找额外的挑战,哈哈,如果我能做一个更复杂的场景,如......,那就更好了。

示例:在文件MountainTowns.php中搜索关键字树木以及您看到树木的任何地方,将其替换为“Mountain Towns”(请注意额外的空间,大写字母可以指示空间的位置)

感谢您的时间并考虑我的问题。

3 个答案:

答案 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调用。