0

我有两个模式数组,比如 orig[ ] 和 repl[ ],我想用相应的 repl[$i] 替换某些 tex 文件中的每个 orig[$i]。

尽管模式包含特殊字符(我以某种方式管理它),但原始模式 orig[*] 非常相似,在结尾处大多不同。例如

orig[1]=string   repl[1]=bla

orig[2]=string1   repl[2]=newbla

orig[3]=string2   repl[3]=else

orig[4]=string11   repl[4]=somethingelse

orig[5]=string$   repl[5]=jimbo

等等。

我试过这段代码

sed -i -e 's/$orig[$i]/$repl[$i]/g' $filename

但它用 'string' 替换了上述所有示例,其余的都附加到它们后面。$orig[$i]我需要每次都准确捕捉。

有人可以帮忙吗?

4

1 回答 1

0

我不认为一个 sed 程序可以为您循环遍历 bash 数组。我们可以构建一个使用 sed 的 bash 脚本,但我们可以只使用 bash:

cat > file << END
this is a string with string11 and string$ here
I also have string1 and string2 as well
END

orig=(string string1 string2 string11 string$)
repl=(bla newbla else somethingelse jimbo)

while IFS= read -r line; do
    for idx in "${!orig[@]}"; do 
        line=${line//${orig[idx]}/${repl[idx]}}
    done
    echo "$line"
done < file
this is a bla with bla11 and bla$ here
I also have bla1 and bla2 as well

糟糕,较短的“字符串”首先匹配。让我们重新排列数组,以便首先出现较长的模式

orig=(string11 string1 string2 string$ string)
repl=(somethingelse newbla else jimbo bla)

while IFS= read -r line; do
    for idx in "${!orig[@]}"; do 
        line=${line//${orig[idx]}/${repl[idx]}}
    done
    echo "$line"
done < file
this is a bla with somethingelse and jimbo here
I also have newbla and else as well

有一些编程方法可以按长度对数组进行排序,但我将把它留作练习或另一个问题。

于 2013-07-04T13:01:30.993 回答