在bash中使用sed内联模式匹配字符串和数字
第1部分: 我必须改变多个参数的值。我有必须更改的旧值,保存在在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
$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.Rankinecho${old_val[@]}${new_val[@]}sed-i/$index/s/$old_val/$new_val/“$rp
i还有一个以前的for
循环步骤,在该步骤中,我从数据映射$values
调用特定参数的值,并计算$new_val
作为百分比(数组)<代码>用于旧值,单位为$values;donew_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/“$rpdone
这在调用$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,