1

次のような長いリストがあります。

D6N
T69TN
K70R
M184V
T215FEG

結果は次のようになります。

D006N
T069TN
K070R
M184V
T215FEG

私はbashが初めてで、列に分割して再フォーマットすることに基づいたアプローチを試みました。ただし、2 番目と 3 番目の推定列の位置と長さは固定されていません。助けてくれてありがとう!

4

6 に答える 6

0

私の知る限り、これに対する単純な純粋な Bash ソリューションはありません。したがって、Perl の式は簡潔であり、Perl はどこにでもあるので、私は Perl を好みます。

s='D6N
T69TN
K70R
M184V
T215FEG'

echo "$s" | perl -ne '/^(\D*)(\d{1,2})(\D*)$/m and printf "%s%03s%s", $1, $2, $3 or print'
于 2016-04-22T09:28:59.753 に答える
0

Bash 正規表現の場合:

#!/bin/bash

re='([[:alpha:]]*)([[:digit:]]*)([[:alpha:]]*)'

while IFS= read -r line; do
    [[ $line =~ $re ]]
    printf "%s%03d%s\n" "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}"
done < infile

これにより、各行が正規表現と一致し、文字、数字、文字の 3 つのグループが取得されます。printfフォーマット文字列は、数字グループが 3 桁より短い場合、その数字グループにゼロが埋め込まれていることを確認します。

于 2016-04-22T14:06:17.160 に答える
0

別のsedベースの実装:

$ cat testfile
D6N
T69TN
K70R
M184V
T215FEG

$ sed -r 's/[0-9]+/00&/g; s/0?0?([0-9]{3})/\1/g' testfile
D006N
T069TN
K070R
M184V
T215FEG

ロジック: 数字が 3 桁の長さになるまで、無条件に数字の前に 2 つのゼロを付け、先頭のゼロを削除します。

于 2016-04-22T10:07:35.233 に答える