【问题标题】:How do I decrement all array indexes in a text file?如何减少文本文件中的所有数组索引?
【发布时间】:2020-12-09 22:22:00
【问题描述】:

背景

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

$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", $2-1)}' file.txt | xargs -I {} sed -i 's/\[\d+\]/{}/g' file.txt

问题

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

【问题讨论】:

标签: awk sed substitution cat xargs


【解决方案1】:

Perl 单行代码使这很容易,覆盖输入文件:

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

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

【讨论】:

  • 您也可以使用s/\d+/$&-1/es/\[\K\d+(?=])/$&-1/e 替换[] 中的第一个数字
【解决方案2】:

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

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

或者,如果您的 Input_file 在 [..] 之间的计数是任意顺序的,那么只需从它们中减少 1,如下所示。

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

【讨论】:

    【解决方案3】:

    使用 GNU sedbash

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-25
      • 1970-01-01
      • 2021-01-12
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多