web-dev-qa-db-ja.com

sedで数字を2桁にゼロで埋める

入力:

201103 1 /mnt/hdd/PUB/SOMETHING
201102 7 /mnt/hdd/PUB/SOMETH ING
201103 11 /mnt/hdd/PUB/SO METHING
201104 3 /mnt/hdd/PUB/SOMET HING
201106 1 /mnt/hdd/PUB/SOMETHI NG

望ましい出力:

201103 01 /mnt/hdd/PUB/SOMETHING
201102 07 /mnt/hdd/PUB/SOMETH ING
201103 11 /mnt/hdd/PUB/SO METHING
201104 03 /mnt/hdd/PUB/SOMET HING
201106 01 /mnt/hdd/PUB/SOMETHI NG

たとえば、1桁しかない場合、0を追加するにはどうすればよいですか。 1は「日」の部分ですか?次の日付形式が必要です:YYYYMM DD。

19
LanceBaynes
$ sed 's/\<[0-9]\>/0&/' ./infile
201103 01 /mnt/hdd/PUB/SOMETHING
201102 07 /mnt/hdd/PUB/SOMETH ING
201103 11 /mnt/hdd/PUB/SO METHING
201104 03 /mnt/hdd/PUB/SOMET HING
201106 01 /mnt/hdd/PUB/SOMETHI NG
14
SiegeX

別の解決策:awk '{$2 = sprintf("%02d", $2); print}'

18
glenn jackman

bashextended regex。を使用する(非sed)方法を次に示します。
この方法により、スコープは個々のラインのより複雑な処理を行うことができます。 (すなわち、単なる正規表現置換以上のもの)

while IFS= read -r line ; do
    if [[ "$line" =~ ^(.+\ )([0-9]\ .+)$ ]]  
    then echo "${BASH_REMATCH[1]}0${BASH_REMATCH[2]}" 
    else echo "$line"
    fi
done <<EOF
201103 1 /mnt/hdd/PUB/SOMETHING
201102 7 /mnt/hdd/PUB/SOMETH ING
201103 11 /mnt/hdd/PUB/SO METHING
201104 3 /mnt/hdd/PUB/SOMET HING
201106 1 /mnt/hdd/PUB/SOMETHI NG
EOF

出力:

201103 01 /mnt/hdd/PUB/SOMETHING
201102 07 /mnt/hdd/PUB/SOMETH ING
201103 11 /mnt/hdd/PUB/SO METHING
201104 03 /mnt/hdd/PUB/SOMET HING
201106 01 /mnt/hdd/PUB/SOMETHI NG
2
Peter.O

私はこのようなことをします:

_sed -E 's/ ([0-9]) / 0\1 /' ./input
_

これは孤独な数をつかみ、グループ' ([0-9]) 'で空白を取り除き、次にそれらを0と空白のパディング_' 0\1 '_で戻します。

_-E_オプションを使用すると、OSXで最新のRegEx式を使用できます(そのため、_"\"_を頻繁に使用する必要はありません)。_-r_は、テストしたLinuxシステムでも同じことを行います。

1
Eric