0

我经历了很多类似的帖子,但没有一个可以应用于我的。

我想以仅匹配第一次出现的方式在某些特定行中使用 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 参数其余脚本在进入循环时保持不变(循环具有编译器选项,例如:重新关联、内联、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

感谢大家的时间和帮助;)

阿米尔

4

2 回答 2

1

我不确定是否正确理解了您的需求,但可能类似于

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

可以完成这项工作。

于 2012-10-28T21:26:29.023 回答
0

这条线有问题

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保持不变。

于 2012-10-29T13:42:08.083 回答