2013-02-12 4 views
0

Итак, я искал ответ на этот вопрос, и действительно, я нашел его, но никто не работает ...perl найти и заменить из командной строки. специальные символы?

У меня есть папка, полная скриптов bash, которые мне нужно изменить. В частности, мне нужно заменить строку

INPUT=/data/scratch02/mpgussert/HAWC-30/${RUN}_reco 

с

INPUT=/data/hawc01/hawcroot/data/hawc/reconstructed/quesadilla/${RUN} 

Я попробовал этот

perl -w -i -p -e "s'INPUT=/data/scratch02/mpgussert/HAWC-30/${RUN}_reco'INPUT=/data/hawc01/hawcroot/data/hawc/reconstructed/quesadilla/${RUN}'g" *.sh 

, который выполняется без ошибок, но не найти и заменить нужный текст. По моему мнению, использование ', чтобы разграничить регулярное выражение, должно искать без специальной замены символа. Это верно? Если да, то какие-либо идеи, почему это не удается?

Я также попытался

perl -w -i -p -e "s/INPUT=\/data\/scratch02\/mpgussert\/HAWC-30\/\$\{RUN\}_reco/INPUT=\/data\/hawc01\/hawcroot\/data\/hawc\/reconstructed\/quesadilla\/\$\{RUN\}/g" *.sh 

обратной косой черты следует игнорировать специальный символ замены, но это возвращает следующее сообщение об ошибке.

Backslash found where operator expected at -e line 1, near "RUN\" 
syntax error at -e line 1, near "RUN\" 
Execution of -e aborted due to compilation errors. 

Так что он ищет RUN \, что не то, что я хочу ... Любые мысли? Буду признателен за любую помощь, которую вы можете дать.

Спасибо!

+2

У вас есть проблемы со сборкой команды оболочки, так что неплохо было бы знать, какую оболочку вы используете! – ikegami

+1

Попробуйте использовать '' 's. Многие оболочки меняют интерполяцию на основе этого, что похоже на сообщение об ошибке. Кроме того, подумайте об изменении разделителя '/', чтобы избежать «наклонных зубочисток». Например, поместите зубочистки прямо: 's | INPUT =/foo/bar | AWESOME |': D (хотя это не единственная возможная замена ограничителя и очень плохой выбор, если требуется * чередование *.) – 2013-02-12 20:25:18

+0

Я нахожусь в Баш, и спасибо! – Tsadkiel

ответ

1

Вы хотите образец быть ...\$\{RUN\}..., но это не то, что вы передаете:

$ echo "...\$\{RUN\}..." 
...$\{RUN\}... 

Вы либо должны сделать больше бежать, или переключиться на одинарные.

$ echo '...\$\{RUN\}...' 
...\$\{RUN\}... 

Все вместе:

perl -i -wpe' 
    s{INPUT=/data/scratch02/mpgussert/HAWC-30/\$\{RUN\}_reco} 
    {INPUT=/data/hawc01/hawcroot/data/hawc/reconstructed/quesadilla/\${RUN}}g 
' *.sh 
+0

Блестяще! Спасибо вам, ikegami! – Tsadkiel

Смежные вопросы