search和replaceLinux中的.htaccess文件

我需要将这一行添加到位于/home/*/site/assets/.htaccess中的每个.htaccess文件,其中*可以是任意数量的目录

我需要罚款这个文本

 RewriteRule ^(.*)$ /site/assets/sym/$1 [L,NS] 

并在其上面添加一行,或者用此replace它

 RewriteCond %{REQUEST_URI} !^/site/assets/sym RewriteRule ^(.*)$ /site/assets/sym/$1 [L,NS] 

我在网上看过这个网站,但是我不清楚如何处理

  1. 生成我想编辑的文件列表(所以find所有匹配这个path的文件:/home/*/site/assets/.htaccess)
  2. 在replace文本中添加换行符

任何人都可以提出一个明确解释它的资源,否则,让我知道我是否正在寻找这个工作的正确工具?

我的操作系统是OS OS 5.5,我运行一个LAMP服务器,如果这有很大的区别,Apache 2。

谢谢

您已经为这项工作select了一套出色的工具!

生成你想编辑的文件列表非常简单 – 我在这里假设你正在使用一个shell来扩展匹配文件名的输出,比如bash或者破折号:

 echo /home/*/site/assets/.htaccess > list.txt 

但是,如果*可能意味着超过1级的目录,我会这样做:

 find -name '.htaccess' /home | grep '/site/assets/sym' > list.txt 

你的shell将expression式扩展成一个列表,并将输出redirect到list.txt。 每行一个文件。

您还可以使用findsearch名为.htaccess的文件,以查看是否有人错过了,如下所示:

 find -name '.htaccess' /home 

在replace文本中添加换行符 – 这取决于您的编辑器。 换行符通常表示为\n

你想做什么,可能可以用一个小的shell脚本来实现 – 当for variable in expression; do .... done for variable in expression; do .... done被使用,它将执行do / done之间的每一行的expression式中的行。 注意 :如果path包含空格,这可能会反弹。

 for file in /home/*/site/assets/.htaccess; do sed 's/RewriteRule \^(.\*)\$ \/site\/assets\/sym\/\$1 \[L,NS\]/RewriteCond %{REQUEST_URI} !^\/site\/assets\/sym\nRewriteRule \^(.\*)\$ \/site\/assets\/sym\/\$1 \[L,NS\]/g' $file > $file.new mv $file $file.old mv $file.new $file done 

(这将在文件名中留下一个名为.htaccess.old的文件。)

重写备用列表收集方法:

 for file in $(find -name '.htaccess' /home | grep '/site/assets/sym'); do sed 's/RewriteRule \^(.\*)\$ \/site\/assets\/sym\/\$1 \[L,NS\]/RewriteCond %{REQUEST_URI} !^\/site\/assets\/sym\nRewriteRule \^(.\*)\$ \/site\/assets\/sym\/\$1 \[L,NS\]/g' $file > $file.new mv $file $file.old mv $file.new $file done 

或者,在一行中,不需要备份:

 for file in /home/*/site/assets/.htaccess; do sed -i 's/RewriteRule \^(.\*)\$ \/site\/assets\/sym\/\$1 \[L,NS\]/RewriteCond %{REQUEST_URI} !^\/site\/assets\/sym\nRewriteRule \^(.\*)\$ \/site\/assets\/sym\/\$1 \[L,NS\]/g' $file; done 

您可以使用sed在匹配模式上方插入行,并随时进行备份。

 for file in $( find /home -name .htaccess | grep /site/assets/sym); do sed -i.bak '/RewriteRule \^(.\*)\$ \/site\/assets\/sym\/\$1 \[L,NS\]/i RewriteCond %{REQUEST_URI} !^/site/assets/sym' "$file" done 
  • sed -i.bak将编辑文件并为每个文件创build一个.bak文件
  • / PATTERN /我另一个模式 – 匹配模式,并插入其他模式