在 Linux 中的 .htaccess 文件中搜索和替换

在 Linux 中的 .htaccess 文件中搜索和替换

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

我需要找到这个文本

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

并在其上方添加一行,或者用此替换

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

我在网上看过这个地点但我不知道该如何处理

  1. 生成我想要编辑的文件列表(因此找到与此路径匹配的所有文件:/home/*/site/assets/.htaccess)
  2. 在替换文本中添加换行符

有人可以推荐一种可以清楚解释这一点的资源吗?或者,如果我找不到,请让我知道我是否正在寻找适合这项工作的正确工具?

我的操作系统是 Cent OS 5.5,如果有很大区别的话,我正在运行 LAMP 服务器,apache 2。

谢谢

答案1

您已经选择了一套出色的工具来完成这项工作!

生成您想要编辑的文件列表非常简单 —— 我在这里假设您正在使用一个可以扩展匹配文件名输出的 shell,例如 bash 或 dash:

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

但是,如果*可以表示多于 1 级的目录,我会选择这样做:

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

您的 shell 会将表达式扩展为列表,并将输出重定向到 list.txt。每行一个文件。

您还可以使用 find 搜索名为 .htaccess 的文件 - 看看是否有您遗漏的文件,如下所示:

find -name '.htaccess' /home

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

您想要做的事情,可能只需一个小型 shell 脚本即可实现 -for variable in expression; do .... done使用时,它将对表达式中的每个单词执行一次 do/done 之间的行。 笔记:如果路径包含空格,则可能会适得其反。

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

答案2

您可以使用 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 将就地编辑文件并为每个文件创建一个 .bak 文件
  • /模式/我另一种模式- 匹配模式并插入另一种模式在它之前。

相关内容