增加文件中的索引

Dad*_*d85 2 linux perl text-processing numeric-data

好吧,看来我找不到做我需要的方法。

假设我有一个这样的文本文件 A

(freqBiasL2[27])      
(SatBiasL1[27])       
(defSatBiasL2_L1[27]) 
(defSatBiasSlope[27]) 
(defSatBiasSigma[27]) 

(freqBiasL2[28])      
(SatBiasL1[28])       
(defSatBiasL2_L1[28]) 
(defSatBiasSlope[28]) 
(defSatBiasSigma[28]) 

(freqBiasL2[29])      
(SatBiasL1[29])       
(defSatBiasL2_L1[29]) 
(defSatBiasSlope[29]) 
(defSatBiasSigma[29])
Run Code Online (Sandbox Code Playgroud)

等等。我想更改 [] 括号之间的索引,使每个索引 i = i+3。

我尝试了 for 循环和 sed 的组合,但不起作用

for i in {27..107..1}
do
    i_new=$((i+3))
    sed -e 's/\['$i'\]/\['$i_new'\]/' prova.txt 

done
Run Code Online (Sandbox Code Playgroud)

问题是它会将前 27 个更改为 30,但在接下来的交互中,它将找到 2 个索引为 30 的块(更改后的块和原始块)。

如何在不覆盖已经更改的索引的情况下执行此操作?

好的,谢谢,我编辑了我的问题以进行改进:如果我有 2 个索引,我该如何做类似的事情:

(freqBiasL2[32][100])
(SatBiasL1[32][101])
(defSatBiasL2_L1[32][102])
(defSatBiasSlope[32][103])
(defSatBiasSigma[32][104])
Run Code Online (Sandbox Code Playgroud)

我只想增加第二个索引而忽略第一个?

wur*_*tel 6

使用 perl:

perl -pe 's/(?<=\[)(\d+)(?=\])/$1+1/ge' prova.txt
Run Code Online (Sandbox Code Playgroud)

解释:

  • -p 意味着遍历每一行并在每一行后打印结果
  • -e 定义要在每一行上执行的表达式
  • s/from/to/ 做一个简单的替换
  • s/(\d+)/$1+1/ge匹配一个或多个数字,将其捕获到 中$1,然后最后的e修饰符告诉 perl$1+1替换字符串是一个表达式:替换$1加 1的值。g修饰符表示全局进行此替换,即每行不止一次。
  • (?<=\[)是一个正的零长度后视断言。这意味着它后面的内容仅在它前面有[(需要用\as转义为[正则表达式中的特殊标记)时才匹配。零长度意味着它不是将被替换的内容的一部分。
  • (?=\])是一个正的零长度前瞻断言。这意味着它之前的内容仅在其后跟](再次转义)时才匹配。

因此,这将需要之间的所有号码[,并]和增加这个数字。