我需要将此行添加到位于其中/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]
我在网上看过这个地点但我不知道该如何处理
- 生成我想要编辑的文件列表(因此找到与此路径匹配的所有文件:/home/*/site/assets/.htaccess)
- 在替换文本中添加换行符
有人可以推荐一种可以清楚解释这一点的资源吗?或者,如果我找不到,请让我知道我是否正在寻找适合这项工作的正确工具?
我的操作系统是 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 文件
- /模式/我另一种模式- 匹配模式并插入另一种模式在它之前。