我有两个模式数组,比如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]
。
有人可以帮忙吗?
答案 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
有一些编程方式可以按长度对数组进行排序,但我会把它留作练习或其他问题。