簡體   English   中英

如何在awk中為我的代碼轉義特殊字符?

[英]How to escape special characters in awk for my code?

我正在使用此代碼來搜索和替換當前目錄中所有php文件中的文本:

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 *

您的主要問題是使用正則表達式而不是字符串,請嘗試以下操作(也改善了文件循環):

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

對於名稱中包含換行符的文件,它仍然會失敗-如果您有可能讓我們知道。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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