在bash中使用sed内联模式匹配字符串和数字

在bash中使用sed内联模式匹配字符串和数字,bash,sed,Bash,Sed,第1部分: 我必须改变多个参数的值。我有必须更改的旧值,保存在$old\u val中,以及取代$new\u val中旧值的新值$index是保存不同参数名称的数组$rp是包含要更改的行的文件,例如: 对于此特定参数$sn,一个包含12个值的数组 old_val=(2 2 0 4 2 2 2 0 2 0) new\u val=(1.828 1.828 0 3.65656 1.828 1.828 1.828 1.828 0 1.828 1.828 1.828 0) 我尝试使用`echo$old\u

第1部分:

我必须改变多个参数的值。我有必须更改的旧值,保存在
$old\u val
中,以及取代
$new\u val
中旧值的新值
$index
是保存不同参数名称的数组
$rp
是包含要更改的行的文件,例如:

对于此特定参数
$sn
,一个包含12个值的数组

old_val=(2 2 0 4 2 2 2 0 2 0)

new\u val=(1.828 1.828 0 3.65656 1.828 1.828 1.828 1.828 0 1.828 1.828 1.828 0)

我尝试使用
`echo$old\u val$new\u val | sed-I/$index/s/$old\u val/$new\u val/“$rp`
(此处,
index=sn
)导致

序列号后面的2和4正在改变,尽管不是全部。我做了一些关于模式匹配的研究,并使用了

`echo$old\u val$new\u val | sed-i/$index(+\+\[0-9]\+\:[0-9]\+\\)\/s/$old\u val/$new\u val/“$rp`
,试图匹配序列号(\:\)

我不太确定模式匹配使用的反斜杠,因为我看到的所有示例都是查找和替换类型。我怎样才能纠正这个问题

第二部分:


在同一个脚本中,如果参数后面没有括号中的数字,那么更改这些参数的代码是什么?e、 例如,
VMIN=0.1,
,这里是
index=VMIN
in$rp

通过使用精确模式匹配
(\b$old\u val\b)
并细化要搜索的行($index.*=)


echo$old_val$new_val | sed-i”/$index.*=/s|\b$old_val\b |$new_val |“$rp

在处理数组和使用
sed
时存在一些语法错误。首先,使用括号
()
而不是花括号
{}
来实例化数组,如
old_val=(2 2 0)
。引用数组时,变量应该放在大括号中,如
echo${old_val[0]}
,方括号中包含索引
${old_val[@]}
返回整个列表。在
sed
-您需要将原始值的位置与新值对齐。使用新值重建新的
rp
文件可能比尝试替换旧文件中的值更容易。谢谢您的建议。对不起,
{}
()
都是我的错,我会改正的。我忘了提到,
$rp
已经是一个副本,每次我尝试更改
$new\u val
,我都会复制原始文件,然后在新制作的副本中进行更改。感谢您指出。
echo$old\u val$new\u val
不会输出所有数组元素
echo${old_val[@]}${new_val[@]}
会这样做吗。@DavidC.Rankin
echo${old_val[@]}${new_val[@]}sed-i/$index/s/$old_val/$new_val/“$rp
i还有一个以前的
for
循环步骤,在该步骤中,我从数据映射
$values
调用特定参数的值,并计算
$new_val
作为百分比(数组)<代码>用于旧值,单位为$values;do
new_val=
`echo$percentage | awk-vo=$old_val-vp=$percentage'{print o*(1+p)}`<代码>echo$old_val$new_val | sed-i/$index/s/$old_val/$new_val/“$rp
done
这在调用
$old\u val
$new\u val
中的单个元素时似乎有效,而不是使用
{$
[@]}
@DavidC.Rankin,抱歉,我无法添加代码块或作为下一行
 VMIN = 0.1,
 ...
 sn(1:3)   = 2, 2, 0,
 sn(4:6)   = 4, 2, 2,
 sn(7:9)   = 2, 2, 0,
 sn(10:12) = 2, 2, 0,
 ...
  sn(1:3)   = 1.81.81.81.81.81.81.81.82828828828828828828828828, 2, 0,
  sn(3.65656:6)   = 4, 1.81.81.81.81.81.81.81.82828828828828828828828828, 2,
  sn(7:9)   = 1.81.81.81.81.81.81.81.82828828828828828828828828, 2, 0,
  sn(10:11.81.81.81.81.81.81.81.82828828828828828828828828) = 2, 2, 0,