如何递减文本文件中的所有数组索引?
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 sed
和 bash
:
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
背景
我有一个如下所示的文本文件:
$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 sed
和 bash
:
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