0

Linux コマンド ラインを使用してテンプレートを解析しています。パイプには、インデックスが 1 の疑似変数がいくつかあります。インデックスが 0 である必要があります。基本的に:

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

なる

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

grepのいずれか、sedまたはawkこの優先順位で使用したいと思います。それはできないと思い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 -pe 's/(?<={)\d+(?=})/$&-1/ge' file.txt

を無視できることが確実な場合は{...}

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

インデックスが常に 1 桁の数字である場合は、より短い数字を使用します

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

With gawk version 4, you can write:

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]
    }
'

Older awks can use

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 
    }
'

Both less elegant than the Perl one-liners.

于 2012-10-04T18:52:27.040 に答える