eu estava procurando substituir '.' período, e esta foi a solução que estou procurando :)
Jonah
1
Não está funcionando no shell bash $ tr, '\ n' uso do aitr: tr [-Ccsu] string1 string2 tr [-Ccu] -d string1 tr [-Ccu] -s string1 tr [-Ccu] -ds string1 string2
Aluno
5
Substituir uma vírgula por um ponto-e-vírgula também funciona:tr ',' ';' < input.csv > output.csv
Você precisa de uma nova linha literal com escape de barra invertida para chegar ao sed. No bash pelo menos,$'' strings serão substituídas \npor uma nova linha real, mas você precisará dobrar a barra invertida que o sed verá para escapar da nova linha, por exemplo,
Obrigado por isso - Gostaria de saber por que meu antigo truque do Linux não funcionou no OSX. Mas isso faz!
Wyatt8740
6
Essa é a única solução que funciona em um script sed.
Firstrock
6
Note que a barra invertida escapa a nova linha literal (de modo que não é um terminador de comando): é não um caractere de continuação (como no bash, etc.). Para ver a diferença, tente escrever o comando acima sem as aspas: a barra invertida será interpretada pelo shell como um caractere de continuação de linha e ela e a nova linha serão descartadas. Por outro lado, inclua o conteúdo da expressão entre aspas (sem aspas) em um arquivo separado por vírgula para newline.sed (que elimina a sintaxe do shell) e funciona!
Nils von Barth
1
isso é bom, pois pode substituir qualquer coisa, não um personagem. tr parece funcionar apenas com caracteres. se você colocar uma string como primeiro parâmetro, ela substituirá toda a ocorrência dos caracteres, não a string.
Shawn
1
@Droogans Você está usando o bash, sh ou um shell diferente? Tem certeza de que está usando aspas simples em vez de aspas duplas?
precisa saber é o seguinte
22
Se o uso sed tende a ser inteiramente expressões de substituição (como o meu tende a ser), você também pode usar perl -peem vez
$ echo 'foo,bar,baz' | perl -pe 's/,/,\n/g'
foo,
bar,
baz
Isso funciona no MacOS Mountain Lion (10.8), Solaris 10 (SunOS 5.10) e RHE Linux (versão 5.3 do Red Hat Enterprise Linux Server, Tikanga) ...
$ sed 's/{pattern}/\^J/g' foo.txt > foo2.txt
... onde isso ^Jé feito com ctrl+ v+ j. Importe-se com o \antes do^J .
PS, eu sei que o sed no RHEL é GNU, o MacOS sed é baseado no FreeBSD e, embora não tenha certeza sobre o Solaris sed, acredito que isso funcionará praticamente com qualquer sed. YMMV tho '...
Este também seria apropriado para o concurso Obfuscated C, exceto que é Bash;)
Aaron R.
@AaronR. Concordo :-). Certamente eu prefiro a trsolução, que já é a resposta aceita.
Ryenus
1
Isso funcionou no OS X. Por que, em \n\rvez de \r\n? Eu tentei \r\nqual é a ordem necessária no Windows. No entanto, depois de fazer isso, está deixando muito^M caracteres de retorno carro vim, então acho que deve ser apenas, \nmas \nsozinho não funciona.
NobleUplift
4
Embora eu esteja atrasado para este post, atualizei minhas descobertas. Esta resposta é apenas para o Mac OS X.
No comando acima, tentei com Shift + Enter adicionar uma nova linha que não funcionou. Portanto, desta vez tentei "escapar" da "nova linha sem escape", conforme informado pelo erro.
Isso não é diferente da resposta de Max Nanasy, dois anos antes da sua.
Miken32
2
Apenas para esclarecer: a página de manual do sed no OSX (10.8; Darwin Kernel Versão 12.4.0) diz:
[...]
Sed Expressões regulares
The regular expressions used in sed, by default, are basic regular expressions (BREs, see re_format(7) for more information), but extended
(modern) regular expressions can be used instead if the -E flag is given. In addition, sed has the following two additions to regular
expressions:
1. In a context address, any character other than a backslash (``\'') or newline character may be used to delimit the regular expression.
Also, putting a backslash character before the delimiting character causes the character to be treated literally. For example, in the
context address \xabc\xdefx, the RE delimiter is an ``x'' and the second ``x'' stands for itself, so that the regular expression is
``abcxdef''.
2. The escape sequence \n matches a newline character embedded in the pattern space. You cannot, however, use a literal newline charac-
ter in an address or in the substitute command.
[...]
então eu acho que é preciso usar tr - como mencionado acima - ou o bacana
sed "s/,/^M
/g"
note: você deve digitar < ctrl> -v, < return> para obter '^ M' no editor vi
sedno macOS Mojave foi lançado em 2005, então uma solução é instalar o gnu-sed,
brew install gnu-sed
então use gsedfará o que você desejar,
gsed 's/,/\n/g' file
Se preferir sed, apenas sudo sh -c 'echo /usr/local/opt/gnu-sed/libexec/gnubin > /etc/paths.d/brew', o que é sugerido por brew info gnu-sed. Reinicie seu termo, então você está sedna linha de comando gsed.
FWIW, a seguinte linha funciona no Windows e substitui ponto-e-vírgula nas variáveis do meu caminho por uma nova linha. Estou usando as ferramentas instaladas no meu diretório git bin.
tr , '\n'
. Eu acho que o sed trata\n
como texto simples.tr , '\n' < file
- sem cachimbo.g
final do script? Eu recebo o mesmo comportamento sem ele.Respostas:
Use em
tr
vez disso:fonte
tr ',' ';' < input.csv > output.csv
Use uma seqüência de caracteres citada ANSI-C
$'string'
Você precisa de uma nova linha literal com escape de barra invertida para chegar ao sed. No bash pelo menos,
$''
strings serão substituídas\n
por uma nova linha real, mas você precisará dobrar a barra invertida que o sed verá para escapar da nova linha, por exemplo,Observe que isso não funcionará em todas as conchas , mas funcionará nas mais comuns.
fonte
echo "a,b" | sed -e $'s/,/\\n/g
.man bash
.sed -E $'s/<\\/br>/\\\n/g' file
, há necessidade de instalar gnu-sed-e
parte parece não ser necessária.funciona no Mac OS X.
fonte
Se o uso sed tende a ser inteiramente expressões de substituição (como o meu tende a ser), você também pode usar
perl -pe
em vezfonte
Aparentemente
\r
é a chave!Transformado isso:
Para isso:
fonte
\r
não é o mesmo\n
e isso pode interromper a manipulação e o uso de dados.\r
!Isso funciona no MacOS Mountain Lion (10.8), Solaris 10 (SunOS 5.10) e RHE Linux (versão 5.3 do Red Hat Enterprise Linux Server, Tikanga) ...
... onde isso
^J
é feito com ctrl+ v+ j. Importe-se com o\
antes do^J
.PS, eu sei que o sed no RHEL é GNU, o MacOS sed é baseado no FreeBSD e, embora não tenha certeza sobre o Solaris sed, acredito que isso funcionará praticamente com qualquer sed. YMMV tho '...
fonte
MacOS é diferente, há duas maneiras de resolver este problema com sed no mac
primeiro, use
\'$'\n''
replace\n
, ele pode funcionar no MacOS:o segundo, basta usar uma linha vazia:
Ps. Preste atenção ao intervalo separado por
'
o terceiro, use gnu-sed substitua o mac-sed
fonte
Para torná-lo completo, isso também funciona:
fonte
tr
solução, que já é a resposta aceita.\n\r
vez de\r\n
? Eu tentei\r\n
qual é a ordem necessária no Windows. No entanto, depois de fazer isso, está deixando muito^M
caracteres de retorno carrovim
, então acho que deve ser apenas,\n
mas\n
sozinho não funciona.Embora eu esteja atrasado para este post, atualizei minhas descobertas. Esta resposta é apenas para o Mac OS X.
No comando acima, tentei com Shift + Enter adicionar uma nova linha que não funcionou. Portanto, desta vez tentei "escapar" da "nova linha sem escape", conforme informado pelo erro.
Trabalhou! (no Mac OS X 10.9.3)
fonte
Apenas para esclarecer: a página de manual do sed no OSX (10.8; Darwin Kernel Versão 12.4.0) diz:
[...]
Sed Expressões regulares
[...]
então eu acho que é preciso usar tr - como mencionado acima - ou o bacana
note: você deve digitar < ctrl> -v, < return> para obter '^ M' no editor vi
fonte
...
Funciona para mim no Mojave
fonte
sed
no macOS Mojave foi lançado em 2005, então uma solução é instalar ognu-sed
,então use
gsed
fará o que você desejar,Se preferir
sed
, apenassudo sh -c 'echo /usr/local/opt/gnu-sed/libexec/gnubin > /etc/paths.d/brew'
, o que é sugerido porbrew info gnu-sed
. Reinicie seu termo, então você estásed
na linha de comandogsed
.fonte
FWIW, a seguinte linha funciona no Windows e substitui ponto-e-vírgula nas variáveis do meu caminho por uma nova linha. Estou usando as ferramentas instaladas no meu diretório git bin.
fonte