O agrupamento de substituição Sed está anexando no OSX em vez do sub esperado no Linux

1

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.

    
por Mike Padg 11.04.2015 / 05:33

4 respostas

3

sed 'h;s/[^,]*,[^,]*,//
     y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
     H;x;s/[^,]*\n//

' foo.file
    
por 11.04.2015 / 11:57
2

\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}'
    
por 11.04.2015 / 21:14
0

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:]])
    
por 11.04.2015 / 09:45
0

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.

    
por 11.04.2015 / 06:39

Tags