2013-11-27 4 views
0

Есть ли perl/sed одна строка для обработки строки $ в скрипте Shell, но не в файловой операции? Результаты google показывают, что perl oneliners предназначены только для файловой обработки.perl один вкладыш для нормальной работы строки (не в файле!)

Forexample, внутри моего скрипта, я использую

$mycurrent_path="/cygdrive/c/project_1/sources/" 
if[[ $1 == "/^project_\d$/i" ]] # For example I call this shell script with "Project_7" as the arg 
    perl -e -i 's/project_\d/$1/ $mycurrent_path` 
fi 
    echo $mycurrent_path 

это должно напечатать бойко: $ /cygdrive/с/project_7/источники/

Perl является очень гибким с Изотерм ехр, но некоторые как, с попыткой кода выше, perl dosen't действует на переменную $ mycurrent_path (также im не уверен, что выражение reg "if [[$ 1 =="/^ project_ \ d $/i "]]" работает отлично, как я делаю в perl, давайте предположим, что это условие проверяется как-то (путем принуждения с 1) и идет внутрь.

ответ

1
$mycurrent_path="/cygdrive/c/project_1/sources/" 

if[[ $1 == "/^project_\d$/i" ]] # For example I call this shell script with "Project_7" as the arg 
    mycurrent_path=`perl -pe "s/project_\d/$1/" <<<"$mycurrent_path"` 
fi 

echo "$mycurrent_path" 

Неправильно использовать переменную оболочки ($1) непосредственно в любом скрипте, даже если оно защищено положением в if. Используя разложение параметра Баш должно быть намного безопаснее

$mycurrent_path="/cygdrive/c/project_1/sources/" 

if[[ $1 == "/^project_\d$/i" ]] # For example I call this shell script with "Project_7" as the arg 
    mycurrent_path="${mycurrent_path/project_?/$1}" 
fi 

echo "$mycurrent_path" 

Или безопаснее версия Perl:

$mycurrent_path="/cygdrive/c/project_1/sources/" 

if[[ $1 == "/^project_\d$/i" ]] # For example I call this shell script with "Project_7" as the arg 
    mycurrent_path=`perl -pe 'BEGIN{$s=shift}s/project_\d/$s/' "$1" <<<"$mycurrent_path"` 
fi 

echo "$mycurrent_path" 
+0

Да это теперь работает;) Большое спасибо –

0

Почему бы не использовать Баш без Perl? Нечто подобное (непроверенные)

mycurrent_path=${mycurrent_path//project_[0-9]/$1} 

, возможно, вам также понадобится 'shopt -s nocasematch' ...

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