Поиск и замена с помощью 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
Ребята, я только что понял, что могу использовать два седла. например так: 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