Търсене и замяна със sed по както в шаблон, така и в линия

Прегледах много подобни публикации, но нито една не можеше да се приложи към моята.

Бих искал да търся и замествам с помощта на sed в някои конкретни редове по начин, който съответства само на първото появяване; да кажем, че имам тази част от скрипта:

processor  <- read.table("../mall_all/adpcm/FULL_DB-constprop", header=TRUE, colClasses=c("reassociate"="factor", "scalarrepl"="factor", "inline"="factor", "sccp"="factor", "loop_reduce"="factor"))

processor<-processor[-c(20:40)]

processor$intensity <- processor$int_high - processor$int_low
processor$performance<- processor$perf_high - processor$perf_low
processor<-processor[-c(1:4)]
processor<-processor[,!names(processor) %in% c("constprop")]

Искам да продължа да променям променливата $constprop в

"../mall_all/adpcm/FULL_DB-constprop"

И

[,!names(processor) %in% c("constprop")]

в цикъл, който написах, проблемът е; Искам параметрите colClasses И останалите скриптове остават същите, докато влизам в цикъла (цикълът има опциите на компилатора като: reassociate, inline, constprop и т.н.)

Чудех се защо търсенето и замяната ми не работят:

set -x
compilerOptionList="constprop dce inline instcombine licm loop_reduce loop_rotate loop_unroll loop_unswitch loop_unswitch mem2reg memcpyopt reassociate scalarrepl sccp simplifycfg "

stringToBeReplaced=constprop

for compilerOption in $compilerOptionList
do
        echo "Using compiler option: $compilerOption"

        //here you could see  the sed scripts

        sed -i "1,15  /FULL_DB/,/header/ s/$stringToBeReplaced/$compilerOption/" r.scr
        stringToBeReplaced=$compilerOption
        make
        mv Rplots.pdf Rplots_adpcm_$compilerOption.pdf
        echo "DONE! $compilerOption"
done

Благодаря на всички за отделеното време и помощта ;)

Амир


person Community    schedule 28.10.2012    source източник
comment
Момчета, току-що разбрах, че мога да използвам две seds. т.е. така: sed -i 2,3 s/$stringToBeReplaced/$compilerOption/ r.scr sed -i 9,11 s/$stringToBeReplaced/$compilerOption/ r.scr   -  person    schedule 29.10.2012
comment
Но, както и да е, оценявам, ако мога да използвам само един sed (ще науча нещо ново ;))   -  person    schedule 29.10.2012


Отговори (2)


Не съм сигурен, че съм разбрал правилно нуждата ви, но може би нещо подобно

sed -e "
    1,15ba;
    /FULL_DB/,/header/ba;
    bb;
    :a;
    s/stringToBeReplaced/$compilerOption/;
    :b;
  " -i r.scr

може да свърши работа.

person F. Hauri    schedule 28.10.2012

Тази линия е проблемна

sed -i "1,15  /FULL_DB/,/header/ s/$stringToBeReplaced/$compilerOption/" r.scr

Това не е валиден синтаксис на командата sed. Ще трябва да оградите част от него в скоби като тази

sed -i "1,15  { /FULL_DB/,/header/ s/$stringToBeReplaced/$compilerOption/ }" r.scr

Но мисля, че по-подреден начин е да се използват отделни файлове за вход и изход на sed, т.е. да се промени този ред на

sed "1,15 s/constprop/$compilerOption/" r.scr_tmp >r.scr

Не се нуждаете от променливата stringToBeReplaced. По този начин винаги замествате "constprop" и не е нужно да се притеснявате, че низът, който трябва да бъде заменен, се появява на друго място в кода.

r.scr_tmp ще съдържа същия код като r.scr с изключение на това, че частта constprop от r.scr_tmp остава непроменена.

person doubleDown    schedule 29.10.2012