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

isa*_*bob 3 awk sed xargs substitution cat

背景

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

$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"
Run Code Online (Sandbox Code Playgroud)

这持续了一千多行。我想做以下事情:

$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"
Run Code Online (Sandbox Code Playgroud)

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

尝试的解决方案

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

尝试 1

我尝试了双重切割技术:

cat file.txt | cut -d '[' -f2 | cut -d ']' -f1 | xargs -I {} expr {} + 1
Run Code Online (Sandbox Code Playgroud)

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

尝试 2

我尝试将 awk 与 sed 混合使用,但这是由机器挂起造成的:

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

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

小智 5

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

perl -pi -e 's/(\d+)/$1-1/e' your-file-name-here
Run Code Online (Sandbox Code Playgroud)

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

  • 您还可以使用 `s/\d+/$&-1/e` 和 `s/\[\K\d+(?=])/$&-1/e` 来替换 `[]` 中的第一个数字 (3认同)