2012-11-12 213 views
0

我正在使用Zend CRUD生成器,我必須用每個字段的表單代碼替換$ targetForm文件中的「測試」一詞。Bash Sed替換

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 

也許有與特價性格問題,但我不知道如何解決它。

回答

2

這個錯誤很可能與sed替代中使用\n無關(尤其是因爲您在評論中提到您正在使用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 

其在末端缺少/,因此錯誤「未終止's'命令「。

爲了解決這個問題,我們要的是插入\,除了最後的每一行的末尾,即

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中的所有行均以;結尾,因此我將;全部替換爲;\,然後從最後一行刪除最後一個\

1

seddoes not support \n in the substitution,但是如果您將其轉義,則可以使用文字換行符。另外,您需要引用'字符。這裏有一種方法:

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之類的東西。

+0

它不起作用,但無論如何,在我的代碼的其他部分它的工作原理:'sed -i「s/<! - fieldshere - >/<! - fieldshere - > \ n $ {line [ $ i]} /「$ targetViewForm' – Sadiel

+0

你正在運行哪個版本的sed,以及哪個操作系統? – andrewdotn

+0

GNU sed version 4.2.1; Ubuntu 12.04.1 LTS – Sadiel