簡體   English   中英

Linux根據文件名提示更改文件內的內容

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM