説明する:

説明する:

数値構成スキームにさまざまな数の先行ゼロを追加するために、sed構文を単純化するのに問題があります。私が操作する文字列は次のとおりです。

1.1.1.1,Some Text Here

sed 構文の使用

sed -r ":r;s/\b[0-9]{1,$((1))}\b/0&/g;tr"

私は反応を引き出すことができます

01.01.01.01,Some Text Here

しかし、私が探しているのは、フィールド2と3を最大2桁で埋め、フィールド4を最大3桁で埋め、すべての項目の標準長が[0-9]になるようにすることです。 [0-9]{ 2}.[0-9]{2}.[0-9]{3}

1.01.01.001,Some Text Here

私は、生涯の間にピリオドの後の数字だけをキャプチャするために必要なパラメータを含めるように境界を変更する方法さえ知りません。私はこれが\ bを使用することに関連していると思います。単語の境界ではゼロ文字と一致することを理解していますが、一致にピリオドを追加しようとすると失敗する理由はわかりません。次のように:

sed -r ":r;s/\.\b[0-9]{1,$((1))}\b/0&/g;tr"
sed -r ":r;s/\b\.[0-9]{1,$((1))}\b/0&/g;tr"
Both cause the statement to hang

sed -r ":r;s/\b[0-9]\.{1,$((1))}\b/0&/g;tr"
sed -r ":r;s/\b[0-9]{1,$((1))}\.\b/0&/g;tr"
sed -r ":r;s/\b[0-9]{1,$((1))}\b\./0&/g;tr"
cause the statement to output:

1.01.01.1,Some Text Here

また、ステートメントに次のテキストが含まれている場合、追加の問題が発生すると予想されます。

1.1.1.1,Some Number 1 Here

sedとそのすべての複雑さを本当に学ばなければならないというのは既定事実でした。私はこの問題を解決しようとしていますが、この特定の声明はしばらくの間問題を引き起こすと予想しています。どんな助けでも大変感謝します。

編集:方法が見つかりました...このステートメントは私が望むように動作するようですが、これを行うためのよりエレガントな方法が必要です。

sed -r ':r;s/\b[0-9]{1,1}\.\b/0&/;tr;:i;s/\b[0-9]{1,2},\b/0&/;ti;s/.//'

また、構文的に言えば、同様の数値書式がテキストに表示されると問題が発生する可能性があります。

1.1.1.1,Some Text Referring to Document XXX Heading 1.2.3

この場合、次のような結果が発生します。

1.01.01.001,Some Text Referring to Document XXX Heading 01.02.03

解決済み 助けてくれてありがとう。最初は、以下の許可された回答を使用して問題を解決しました。次のソートを活用するより大きなソリューションの一部として、このソリューションをPythonに移動したいと思います。

def getPaddedKey(line):
    keyparts = line[0].split(".")
    keyparts = map(lambda x: x.rjust(5, '0'), keyparts)
    return '.'.join(keyparts)

s=sorted(reader, key=getPaddedKey)

ベストアンサー1

bashはこれを処理できます。しかし、Perlよりはるかに遅いです。

echo "1.1.1.1,Some Text Here" | 
while IFS=., read -r a b c d text; do
    printf "%d.%02d.%02d.%03d,%s\n" "$a" "$b" "$c" "$d" "$text"
done
1.01.01.001,Some Text Here

おすすめ記事