使用sed替换多个和类似的模式

时间:2013-07-04 09:02:41

标签: sed design-patterns similarity

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

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

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'替换了所有上面的例子,其余的被附加到它们上面。我需要每次都捕获EXACT $orig[$i]

有人可以帮忙吗?

1 个答案:

答案 0 :(得分: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

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

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

有一些编程方式可以按长度对数组进行排序,但我会把它留作练习或其他问题。