[英]Linux Prompt Change Content Within File based on File Name
我知道如何在文件組之間進行搜索和替換:
perl -pi -w -e's / search / replace / g;' * .php
因此,我可以使用它來搜索關鍵字或短語並進行更改。 但是我有一個更復雜的任務,我不知道該怎么做。
我想搜索並替換所有php文件中的內容以搜索特定的關鍵字,並將其替換為文件名減去擴展名。
示例:在文件Mountains.php中搜索關鍵字Trees,隨處可見Trees,將其替換為Mountains
當然,我希望能夠批量處理數百個具有不同名稱的php文件,但是這些文件都包含搜索詞Trees。
如果有人正在尋找額外的挑戰,哈哈,那我可以做一個更復雜的場景,那就更好了……
示例:在文件MountainTowns.php中搜索關鍵字Trees,然后在所有看到的Trees處將其替換為“ Mountain Towns”(請注意多余的空格,大寫字母可以指示空格)
感謝您的時間,並考慮我的問題。
好的,文件名在$ 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
這可能對您有用:
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為第二個請求提供解決方案。
您希望為每個文件單獨替換,因此請運行單獨的搜索並為每個文件替換:
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
調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.