sed: 0 を入力し、数値文字列を特定の数値に拡張します。

sed: 0 を入力し、数値文字列を特定の数値に拡張します。

私は現在sedにパイピングしてエコーされた英数字文字列を修正しようとしています。私が修正したい領域は、前に適切な数のゼロを挿入して8文字の長さにしたい数値ブロックです。たとえば、

入力する:

loremipsumdolorsit2367amet

希望の出力:

loremipsumdolorsit00002367amet

sedを使用してこれを実行できますか?私が扱っている数字のブロックは8文字未満です。わからないこれ投稿は非常に便利です。

編集:各文字列には1つの数値セットしかありません。

答え1

これは、数字の後に数字ではなくテキストが続くと仮定します。

echo "loremipsumdolorsit2367amet" \
| sed -r -e 's/[0-9]/0000000&/' -e 's/0*([0-9]{8}[^0-9])/\1/'

結果:loremipsumdolorsit00002367amet

これは次のことを前提としていません。

... | sed -r -e 's/[0-9]/0000000&/' -e 's/0*([0-9]{8}([^0-9]|$))/\1/'

彼らはsedのEREモードを使用します。多くのsed実装はこの-rフラグを使用してそれを指定します。一部-Eでは、両方のフラグを使用します。現在、sedでEREモードを使用する機能はPOSIX標準の一部ではありませんが、標準に追加するための議論が進行中です。私は何らかの方法でEREモードを使用しない最新のsed実装をまだ見たことがありません。

場合によっては、デフォルトのsedモード(BRE)を使用して実行できない操作は、EREモードを使用して実行されることがあります。バラよりこの回答へのコメント。しかし、現在の状況では、EREモードを使用するのは便宜のためだけです。 schがコメントで述べたように、-r(または)フラグを省略してwithとに-E置き換えることができます。私の元の答えはBREパターンの一部ではなくBREを使用しましたが、実際にはソリューションには必要ありません。(...)\(...\){8}\{8\}+

答え2

すべてのsedの場合:

sed 's/[0-9]\{1,\}/0000000&/g;s/0*\([0-9]\{8,\}\)/\1/g'

答え3

これはPerlを使用して達成できます。

perl -e 'my $a="loremipsumdolorsit2367amet"; $a =~ s/([0-9]+)/sprintf("%010d",$1)/e; print $a'

得る:

loremipsumdolorsit0000002367amet

すべての入力ラインを処理します。

perl -pe 's/([0-9]+)/sprintf("%010d",$1)/e'

答え4

sedではありませんが、ここに少し洗練された(GNU)awkの代替案があります。

echo loremipsumdolorsit2367amet | awk '{gsub( /[0-9]+/, sprintf( "%08d", gensub(/[^0-9]/, "","g"))); print}' 
loremipsumdolorsit00002367amet

関連情報