我正在寻找一个shell脚本,它扫描一个目录及其所有子目录的.php和.phtml文件。在这些文件中,我正在寻找$ this-> translate('')语句(也是$ this-> view-> translate('')),我想在文本文件中保存这些语句的内容。
问题是,这些陈述有几种不同的类型:
我已经编写了一个脚本,一个来自starmind.com的人给我发了以下几行:
echo -n > give_me_your_favorite_outfile_name.txt
for i in `find . -iname '*php' `
do
echo -n "Processing $i ..."
# echo " +++++++ from $i ++++++++" >> give_me_your_favorite_outfile_name.txt
cat $i | sed -n -e '/->translate(*/p' | sed -e 's/\(.*->translate(.\)\([a-z A-Z \d092\d039\d034]*\)\(.*\)/\2/g' | sed -e 's/\(.*\)\(\d039\)/\1/g' | sed -e 's/\(.*\)\(\d034\)/\1/g' >> give_me_your_favorite_outfile_name.txt
echo " done"
done
for i in `find . -iname '*phtml' `
do
echo -n "Processing $i ..."
# echo " +++++++ from $i ++++++++" >> give_me_your_favorite_outfile_name.txt
cat $i | sed -n -e '/->translate(*/p' | sed -e 's/\(.*->translate(.\)\([a-z A-Z \d092\d039\d034]*\)\(.*\)/\2/g' | sed -e 's/\(.*\)\(\d039\)/\1/g' | sed -e 's/\(.*\)\(\d034\)/\1/g' >> give_me_your_favorite_outfile_name.txt
echo " done"
done
不幸的是,它并没有涵盖所有上述情况,特别是报价案例中的行情。由于我根本不是shell专家,需要该脚本进行验证,我很乐意得到你们的帮助。
重要说明:必须用Shell编写。存在PHP版本。
答案 0 :(得分:1)
find /path -type f \( -name "*.php" -o -name "*.phtml" \) | while IFS= read -r -d $'\0' file
do
while read -r line
do
case "$line" in
*'$this->translate'* | *'$this->view->translate'* )
line="${line#*this*translate(}"
line="${line%%)*}"
case ${line:0:1} in
\$) s=${line:0};;
*) s=${line:1:${#line}-2};;
esac
case "$s" in
*[\"\'],* )
s=${s/\\/}
echo ${s%%[\"\'],*};;
* ) echo "$s";;
esac
esac
done < "$file"
done
答案 1 :(得分:1)
这是在Bash sed
循环中使用while
进行的,并演示了为了各种原因而执行find
的另一种方法:
find . -iregex ".*\.php\|.*\.phtml" |
while read f
do
sed -n '/[\"\o047]/ {s/$this->\(view->\|\)translate([\"\o047]\(.*\)[\"\o047].*)/\2/; s.\\..;p}' $f
done > outputfile.txt
修改强>
要处理该行上的其他文本,请将sed
命令更改为:
sed -n '/[\"\o047]/ {s/.*$this->\(view->\|\)translate([\"\o047]\(.*\)[\"\o047].*).*/\2/; s.\\..;p}' $f
(只需在搜索字符串的开头和结尾添加.*
。)