2017-08-31 307 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