Preencha com zero os números para 2 dígitos com sed

18

Entrada:

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

Saída desejada:

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

Como posso adicionar um 0 se houver apenas um único dígito, por exemplo, 1 na parte "dia"? Eu preciso deste formato de data: AAAAMM DD.

    
por LanceBaynes 12.03.2011 / 11:59

5 respostas

13
$ 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
    
por 12.03.2011 / 12:02
17

Outra solução: awk '{$2 = sprintf("%02d", $2); print}'

    
por 12.03.2011 / 15:35
2

Aqui está uma maneira (não-sed) de usar bash com regex estendido .
Esse método permite que o escopo faça um processamento mais complexo de linhas individuais. (ou seja, mais do que apenas substituições regex)

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

saída:

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
    
por 12.03.2011 / 18:50
1

Eu faria algo assim:

sed -E 's/ ([0-9]) / 0 /' ./input

Isso pega números solitários, retira-os do espaço em branco com um grupo ' ([0-9]) ' , depois os coloca de volta com 0 e preenchimento de espaço em branco ' 0 ' .

A opção -E permite expressões modernas do RegEx no OSX (assim você não precisa usar "\" com tanta frequência), -r faz a mesma coisa nos sistemas linux que eu testei.

    
por 17.12.2017 / 14:58
-1
while read a b c
do 
new_format=$(printf "%02d" $b)
echo "$a $new_format $c"
done </tmp/input
    
por 13.07.2018 / 20:50