2012-03-06 2 views
0

に基づいてファイル内のLinuxプロンプトの変更内容:ファイル名

のperl -pi -w -eさん/検索/置換/グラム; ' * .php

だから、それを使ってキーワードやフレーズを検索して変更することができます。しかし、私はやり方がわからない、もっと複雑な仕事をしています。

特定のキーワードを検索し、ファイル名から拡張子を差し引いたものに置き換えるために、すべてのphpファイルを検索して置換したいと考えています。

例:キーワードの木のファイルMountains.phpを検索し、どこでも、あなたは木を見、数百のPHPはすべてのファイルの私は、バッチでそれを行うことができるようにしたいもちろん山脈

と交換ただし、名前の異なるものは検索用語ツリーをすべて含んでいます。誰かが余分な挑戦を探しているなら、私のような、より複雑なシナリオを行うことができれば

、ハハ、それは....

例でも良いだろう:キーワードの木のファイルMountainTowns.phpを検索します余分なスペースに注意してください、大文字はスペースがどこに行くかを示すことができます)

あなたの時間と私の質問を考慮していただきありがとうございます。

+1

私はそのような大規模な変更を行うときに '-i〜'を使いたいと思います。次に 'diff -u'を実行して、変更が正しいことを確認し、' find -name 'を使ってバックアップを簡単に削除することができます。*〜' -delete' – ikegami

答えて

2

ファイル名は$ ARGVになっていますので、必要な作業はそれほど多くありません。

perl -i -pe '($x=$ARGV)=~s{.php$}{};s{Trees}{$x}g' BlueMountains.php RedMountains.php 

perl -i -pe '($x=$ARGV)=~s{.php$}{};$x=~s{(.)([A-Z])}{$1 $2}g;s{Trees}{$x}g' BlueRedMountains.php 
+0

ありがとう、本当の助け!もう少し考えて私は私の仕事を完了し、私のプロジェクトから時間を節約することができると非常に確信しています。 –

+0

'[A-Z]'は多分国際化のために '[[:upper:]]'に置き換えてください。 –

-1

あなたは、ファイルごとに別々の交換をしたいので、別の検索を実行し、それぞれに置き換える:

for file in *.php; do sed -i "s/foo/${file%.*}/g" "$file"; done 

そして、あなたの2番目の要求が少し難しいですが、それは少なくともサブシェルが必要です。

for file in *; do sed -i "s/bar/$(echo ${file%.*} | sed 's/\(.\)\([A-Z]\)/\1 \2/')/g" "$file"; done 

それはあなたがスクリプトでそれを置けばもう少し読みやすいです:

#!/bin/bash 
for file in "[email protected]"; do 
     replacement=$(echo ${file%.*} | sed 's/\(.\)\([A-Z]\)/\1 \2/') 
     sed -i "s/bar/$replacement/g" "$file"; 
done 

これはそれを渡されたすべての引数上で動作するので、./script.sh *.phpで呼び出します。

+0

誰でも気をつけてください。私はどこかで間違いを犯しましたか?疑問を誤解している?不必要にperlを起動しませんか? – Kevin

0

の完全なラインのためにこれはあなたのために働くかもしれない、upcased文字の前にスペースを追加する

$x=~s{(.)([A-Z])}{$1 $2}g; 

に追加します。

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 

これは、2番目の要求のためのソリューションを提供するために、sedを使用しています。