数値の体系的なスキームにさまざまな数の先行ゼロを追加するために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)
printf
(またはprintf
Awk内の呼び出し)の方が簡単かもしれません。
sed -r ':r;s/\b[0-9]{1,1}\.\b/0&/;tr;:i;s/\b[0-9]{1,2},\b/0&/;ti;s/.//'
しかし、よりエレガントなアプローチがあるかどうか知りたいです。