$ 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
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.
Outra solução: awk '{$2 = sprintf("%02d", $2); print}'
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
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.
while read a b c
do
new_format=$(printf "%02d" $b)
echo "$a $new_format $c"
done </tmp/input