0

我正在使用 Zend CRUD 生成器,我必须用每个字段的表单代码替换 $targetForm 文件中的单词“test”。

field[0]="foo"
field[1]="bar"

textareafield='$'"acme_en = new Utils_Form_Element_Textarea('acme_en',array('langblock'=>'en', 'isWysiwyg' => true));
    "'$'"this->addElement("'$'"acme_en);
    "'$'"this->addElement('textarea','acme_fr', array( 'label'=>__('acme'), 'langblock'=>'fr', 'isWysiwyg' => true, 'altLangElem' => "'$'"acme_en));"    

for ((i=0; i<${#field[@]}; i++));
do
    formfield[$i]=$textareafield
    formfield[$i]=${formfield[$i]//acme/${field[$i]}}
    echo ${formfield[$i]}
    sed -i "s/test/test\n        ${formfield[$i]}/" $targetForm
done

命令行说:

$foo_en = new Utils_Form_Element_Textarea('foo_en', array('langblock'=>'en', 'isWysiwyg' => true)); $this->addElement($foo_en); $this->addElement('textarea','foo_fr', array( 'label'=>__('foo'), 'langblock'=>'fr', 'isWysiwyg' => true, 'altLangElem' => $foo_en));
sed: -e expression #1, char 120: unterminated `s' command
$bar_en = new Utils_Form_Element_Textarea('bar_en', array('langblock'=>'en', 'isWysiwyg' => true)); $this->addElement($bar_en); $this->addElement('textarea','bar_fr', array( 'label'=>__('bar'), 'langblock'=>'fr', 'isWysiwyg' => true, 'altLangElem' => $bar_en));
sed: -e expression #1, char 120: unterminated `s' command

也许特殊字符有问题,但我不知道如何解决。

4

2 回答 2

2

\n您得到的这个错误很可能与使用in replacement无关sed(特别是因为您在评论中提到您正在使用GNU sed version 4.2.1)。


真正的罪魁祸首是textareafield它包含一个多行字符串。

发生的情况是,当${formfield[$i]}扩展时,您的sed命令如下所示

sed -i "s/test/test\n        line1
line2
line3/"

这是有问题的,因为在这种情况下,如果不使用文字来终止行\sed则会将每一行本身解释为一个完整的命令

s/test/test\n        line1

最后缺少 a /,因此出现错误“ unterminated `s' command ”。

为了解决这个问题,我们想要的是在\除最后一行之外的每一行的末尾插入 a,即

sed -i "s/test/test\n        line1\
line2\
line3/"

我通过添加两行让您的示例生效

for ((i=0; i<${#field[@]}; i++));
do
    formfield[$i]=$textareafield
    formfield[$i]=${formfield[$i]//acme/${field[$i]}}
    formfield[$i]=${formfield[$i]//\;/\;\\}
    formfield[$i]=${formfield[$i]%\\}
    echo ${formfield[$i]}
    sed -i "s/test/test\n        ${formfield[$i]}/" $targetForm
done

由于以textareafield结尾的所有行;,我都用 替换了所有;;\,然后从最后一行中删除了\最后一行。

于 2012-11-13T10:36:58.067 回答
1

sed 不支持\n替换,但是如果您对其进行转义,则可以使用文字换行符。此外,您需要引用'字符。这是一种方法:

for ((i=0; i<${#field[@]}; i++));
do
    formfield[$i]=$textareafield
    formfield[$i]=${formfield[$i]//acme/${field[$i]}}
    sedexpr="${formfield[$i]}"
    sedexpr="${sedexpr//\'/\'}"
    sedexpr="${sedexpr//
/\\
}"
    sed -i "s/test/test\
        ${sedexpr}/" $targetForm
done

但是在这种复杂程度下,您最好切换到 Python 之类的东西。

于 2012-11-12T22:23:09.487 回答