0

我正在使用具有一些 1 索引伪变量的管道使用 linux 命令行解析模板,我需要 0 索引。基本上:

...{1}...{7}...

成为

...{0}...{6}...

我想使用其中一个grepsedawk按此优先顺序。我想grep不能那样做,但我不确定。这种算术运算甚至可以使用这些中的任何一个吗?

  • 文件中使用的数字在范围内0-9,所以忽略像23变得这样的问题12
  • 文件中没有其他数字,因此您甚至可以忽略{}
  • 我可以使用 python、ruby 来做到这一点,但我不想那么坚持标准的命令行工具
  • 其他可用于带有我不知道的正则表达式的管道的命令行实用程序也很好

编辑:改写第一个要点以澄清

4

3 回答 3

4

如果输入允许,您可以简单地逃脱:

tr 123456789 012345678

请注意,这将替换任何数字的所有实例,因此可能不合适。(例如,12变为01。从问题中不清楚是否必须处理 2 位值。)

如果您确实需要处理多位数字,您可以这样做:

perl -pe 's/\{(\d+)\}/sprintf( "{%d}", $1-1)/ge'
于 2012-10-04T16:55:24.620 回答
2

你可以使用 Perl。

perl -pe 's/(?<={)\d+(?=})/$&-1/ge' file.txt

如果您确定可以忽略{...},请使用

perl -pe 's/\d+/$&-1/ge' file.txt

如果索引总是只有一位数字,那么选择较短的数字

perl -pe 's/\d/$&-1/ge' file.txt
于 2012-10-04T16:58:17.880 回答
1

使用 gawk 版本 4,您可以编写:

gawk '
    {
        n = split($0, a, /[0-9]/, seps)
        for (i=1; i<n; i++)
            printf("%s%d", a[i], seps[i]-1)
        print a[n]
    }
'

较旧的 awks 可以使用

awk '
    {
        while (match(substr($0,idx+1), /[0-9]/)) {
            idx += RSTART
            $0 = substr($0,1, idx-1) (substr($0,idx,1) - 1) substr($0,idx+1)
        }
        print 
    }
'

两者都没有 Perl 单行代码那么优雅。

于 2012-10-04T18:52:27.040 回答