2017-08-31 25 views
0

我使用這個代碼搜索和當前目錄替換所有的PHP文件中的文本:如何在awk中爲我的代碼轉義特殊字符?

for file in `find * -type f -name "*.php"`; do awk 'BEGIN { RS="" } FILENAME==ARGV[1] { s="$0" } FILENAME==ARGV[2] { r="$0" } FILENAME==ARGV[3] { gsub(s,r) ; print }' "zsearch" "zreplace" "$file" > "$file"tmp7 && mv "$file"tmp7 "$file";echo "$file"; done 

如果zsearch文件的內容:

<br> 
<center><!--LiveInternet counter--><script type="text/javascript"><!-- 

它的工作很好,但如果zsearch文件的內容:

<!--LiveInternet counter--><script type="text/javascript"><!-- 
document.write("<a href='http://www.liveinternet.ru/click' "+ 
"target=_blank><img src='http://counter.yadro.ru/hit?t16.6;r"+ 
escape(document.referrer)+((typeof(screen)=="undefined")?"": 
";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth? 
screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+ 
";"+Math.random()+ 
"' alt='' title='LiveInternet: показано число просмотров за 24"+ 
" часа, посетителей за 24 часа и за сегодня' "+ 
"border=0 width=88 height=31></a>")//--></script><!--/LiveInternet--> 

它不工作,而不是取代

我認爲這是由於括號(中的符號document.write("

也許我需要轉義其他符號,如+ or *

回答

1

你的主要問題是使用正則表達式而不是字符串,試試這個(也提高了你的文件迴路):

find * -type f -name "*.php" | 
while IFS= read -r file; do 
    awk ' 
     BEGIN { RS="" } 
     FILENAME==ARGV[1] { old=$0 } 
     FILENAME==ARGV[2] { new=$0 } 
     FILENAME==ARGV[3] { 
      if (start = index($0,old)) { 
       $0 = substr($0,1,start-1) new substr($0,start+length(old)) 
      } 
      print 
     } 
    ' "zsearch" "zreplace" "$file" > "$file"tmp7 && 
    mv "$file"tmp7 "$file" 
    echo "$file" 
done 

它還是會失敗的有換行符在其名稱中的文件 - 如果這是一個可能性你讓我們知道。

+0

謝謝你的回答,我測試了代碼,它不工作,它沒有任何變化,嘗試了一小部分文本從「<! - LiveInternet counter - >」替換爲「替換文本」。也許有代碼中的「substr」的一些錯字?我想以簡便的方式搜索和替換文本或代碼,只需簡單地複製粘貼文本或代碼即可,而不需要困難的正則表達式規則。 – kostya572

+0

在我的代碼中沒有正則表達式,它是一個簡單的字符串替換,我沒有看到任何代碼問題,但顯然我無法測試它,因爲您的問題不包括我可以測試的示例輸入/輸出。噢,請繼續 - 這是'$ 0'附近的引號。你的代碼有's =「$ 0」'而不是's = $ 0',我只是複製了它而沒有考慮它。修復現在... –

+1

哇,現在一切都很好!行情改變了一切,你幫了我很多。我已經看到了sed的類似解決方案,但我更喜歡使用外部文件的awk解決方案。 – kostya572