如何获得$ this-> translate('Content')=>文本文件中的内容

时间:2009-12-08 08:36:40

标签: bash shell sed

我正在寻找一个shell脚本,它扫描一个目录及其所有子目录的.php和.phtml文件。在这些文件中,我正在寻找$ this-> translate('')语句(也是$ this-> view-> translate('')),我想在文本文件中保存这些语句的内容。

问题是,这些陈述有几种不同的类型:

  • $ this-> translate('Single Quotes')//我需要:单引号
  • $ this-> translate(“Double Quotes”)//我需要:Double Quotes
  • $ this-> translate('单引号与%1 $ s占位符',$ xy)//我需要:带有%1 $ s占位符的单引号
  • $ this-> translate(“双引号与%1 \ $ s”,$ xy)//我需要:Dobule引用%1 $ s
  • $ this-> view-> translate('with view')//我需要:有视图
  • $ this-> view-> translate(“with view 2”)//我需要:使用视图2
  • $ this-> translate('Single Quotes with“Doubles”')//我需要:单引号带“双打”
  • $ this-> translate(“Double Quotes with'Singleles')//我需要:带有'单身'的双引号

我已经编写了一个脚本,一个来自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版本。

2 个答案:

答案 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

(只需在搜索字符串的开头和结尾添加.*。)