次のような長いリストがあります。
D6N T69TN K70R M184V T215FEG
結果は次のようになります。
D006N T069TN K070R M184V T215FEG
私はbashが初めてで、列に分割して再フォーマットすることに基づいたアプローチを試みました。ただし、2 番目と 3 番目の推定列の位置と長さは固定されていません。助けてくれてありがとう!
私の知る限り、これに対する単純な純粋な 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'
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 桁より短い場合、その数字グループにゼロが埋め込まれていることを確認します。
別の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 つのゼロを付け、先頭のゼロを削除します。