增加文件中的索引

增加文件中的索引

好吧,看来我找不到办法做我需要的事情。

假设我有一个这样的文本文件 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])

等等。我想更改 [] 括号之间的索引,使得每个索引 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

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

如何在不覆盖已经更改的索引的情况下做到这一点?

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

(freqBiasL2[32][100])
(SatBiasL1[32][101])
(defSatBiasL2_L1[32][102])
(defSatBiasSlope[32][103])
(defSatBiasSigma[32][104])

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

答案1

使用perl:

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

解释:

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

因此,这将获取 和 之间的所有数字[]增加该数字。

答案2

您还可以使用awk

awk -F '[\\[\\]]' '{if ($2) { sub($2, $2 + 3)}} 1' prova.txt

事实上,这可以稍微缩短为:

awk -F '[\\[\\]]' '$2 { sub($2, $2 + 3)} 1' prova.txt

答案3

我知道您已经解决了您的问题,但仅供参考,您可以通过对代码进行非常简单的修改来解决它:通过反转您循环的序列。

使用{107..27..-1}(或更简洁地说{107..27})就足以解决您的问题,因为在替换 30 时,只会找到原始的 30,而 27 尚未被替换。

答案4

好吧,我想我已经找到了双索引的解决方案以及修改 cas 的命令。这使得工作:

perl -p -e 's/\[(\d+)\]\[(\d+)\]/"[" . ($1) . "][" . ($2+40) . "]"/ge' prova.txt

顺便不确定为什么我需要. ($1) .(用空格点)。

相关内容