如何递减文本文件中的所有数组索引?

How do I decrement all array indexes in a text file?

背景

我有一个如下所示的文本文件:

$SomeText.element_[1]="MoreText[3]";\r"
$SomeText.element_[2]="MoreText[6]";\r"
$SomeText.element_[3]="MoreText[2]";\r"
$SomeText.element_[4]="MoreText[1]";\r"
$SomeText.element_[5]="MoreText[5]";\r"

这持续了一千多行。我想执行以下操作:

$SomeText.element_[0]="MoreText[3]";\r"
$SomeText.element_[1]="MoreText[6]";\r"
$SomeText.element_[2]="MoreText[2]";\r"
$SomeText.element_[3]="MoreText[1]";\r"
$SomeText.element_[4]="MoreText[5]";\r"

文件中每行文本最左边的索引应减一,其余文本不变。

尝试过的解决方案

到目前为止,我已经尝试了以下...但我的问题是我不知道如何将它正确地反馈到文件中:

尝试 1

我尝试了双切技术:

cat file.txt | cut -d '[' -f2 | cut -d ']' -f1 | xargs -I {} expr {} + 1

这正确地将所有减一的指标输出到命令行。

尝试 2

我尝试将 awk 与 sed 混合使用,但这导致机器挂起:

awk -F'[' '{printf("%d\n", -1)}' file.txt | xargs -I {} sed -i 's/\[\d+\]/{}/g' file.txt

问题

如何正确地将文件中的所有数组索引减一,并将减少后的索引正确写入文本文件的正确位置?

Perl one-liner 使这变得简单,覆盖输入文件:

perl -pi -e 's/(\d+)/-1/e' your-file-name-here

(假设每行的第一个数字是索引)

通过简单的 awk,您可以尝试使用所示示例进行跟踪、编写和测试。

awk '
match([=10=],/\[[^]]*/){
  print substr([=10=],1,RSTART) count++ substr([=10=],RSTART+RLENGTH)
}
' Input_file

或者如果您的 Input_file 在 [..] 之间的计数是任意顺序的,那么只需按如下方式从中减少 1

awk '
match([=11=],/\[[^]]*/){
  print substr([=11=],1,RSTART) substr([=11=],RSTART+1,RLENGTH)-1 substr([=11=],RSTART+RLENGTH)
}
' Input_file

使用 GNU sedbash:

sed -E "s/([^[]*\[)([0-9]+)(].*)/printf '%s%d%s\n' '' $(( - 1)) ''/e" file

或者,如果这些行可能包含 ' 个字符:

sed -E "
/\[[0-9]+]/{
    s/'/'\\''/g
    s/([^[]*\[)([0-9]+)(].*)/printf '%s%d%s\n' '' $(( - 1)) ''/e
}" file