sed 'h;s/[^,]*,[^,]*,//
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
H;x;s/[^,]*\n//
' foo.file
Eu tenho três colunas separadas por vírgulas. Sobrenome, nome, social.
Estou tentando capitalizar todos os caracteres na coluna do sobrenome usando
sed 's/\([^,]*\)/\U/' foo.file
No osx, este comando está anexando um U maiúsculo ao início de cada linha, em vez de capitalizar a coluna Sobrenome, mas funciona como esperado na minha instância do ubuntu.
Não consigo entender por que isso está acontecendo.
A página man lista um bug "Caracteres multibyte não podem ser usados como delimitadores com os comandos '' s '' e '' y ''. Eu não tinha certeza se / era um caractere multibyte ou não (não pensei que era), mas a mesma coisa acontece se eu substituir o delimitador por 'i'. Portanto, esse não é o problema.
sed 'h;s/[^,]*,[^,]*,//
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
H;x;s/[^,]*\n//
' foo.file
\U
é um GNUism, na verdade inspirado em um BSDism, já que vem do comando equivalente s
no editor ex
(modo de linha de comando de vi
).
OS / X sed
provavelmente descende do próprio FreeBSDs descendendo do sed
do 4.4BSD, que foi reescrito do zero após questões de direitos autorais com AT & T. Em qualquer caso, nem o BSD nem o AT & T sed
suportam \U
no seu comando s
.
Para converter em maiúsculas, em sed
portably, você geralmente usa o comando y
como já foi mostrado .
Mas aqui uma abordagem melhor provavelmente é usar awk
:
awk -F, -vOFS=, '{$1 = toupper($1); print}'
A tarefa simples não requer sed
while IFS=',' read -r first mid last
do
echo "$first, $mid, ${last^^}"
done < file_with_commas
Se bash
versão não suportar expansão de variável, você pode usar tr
last=$(echo $last | tr [[:lower:]] [[:upper:]])
Parece / U e / L simplesmente não funcionam com o OSX / BSD sed
junto com
sed /pattern/,+2d # like 'sed '/pattern/{N;N;d;}''
sed -n 0~3p # like 'awk NR%3==0'
sed /pattern/Q # like 'awk '/pattern/{exit}1'' or 'sed -n '/pattern/,$!p''
sed 's/\b./\u&/g' # \u converts the next character to uppercase
sed 's/^./\l&/' # \l converts the next character to lowercase
sed -i '1ecat file_to_prepend' file # e executes a shell command
sed -n l0 # 0 disables wrapping
Obrigado a vocês. Minha reputação ainda não é alta o suficiente para melhorar, mas Mike resolveu meu problema com sed e concordo com Stephane. Awk parece ser a melhor escolha.