Outra maneira de substituir novas linhas em vez de usar tr

3

Eu uso o comando:

tr '\n' ' ' < input.txt > output.txt

para converter novas linhas em espaços usando o comando tr .

Funciona bem para arquivos individuais - mas eu tenho vários arquivos que eu preciso para executar um único comando em ... semelhante ao seguinte comando para fazer troca de texto:

find /directory/. -type f -exec sed -i 's/oldtext/newtext/g' {} \;

Existe um comando que eu possa adicionar a um script bash (como o acima usando find) para remover \n ?

    
por speld_rwong 01.05.2017 / 03:02

3 respostas

2

Isso funcionará mesmo sem loop para todos os nomes de arquivos que começam com file :

perl -pe 's/\n/ /g' file*

Para tais operações, eu prefiro o perl. Tem a mesma sintaxe com sed, é portável e não tem todos esses parâmetros estranhos. Você também pode aplicar -i switch a perl (como sed) para fazer alterações no local: perl -i.old -pe .... (será feito backup do arquivo antigo com extensão .old - você pode usar apenas -i e nenhum arquivo de backup será mantido )

Se preferir, você pode usar o comando find desta forma:

$ find . -type f -name 'file*' -exec bash -c 'tr "\n" " " <$0 >$0.new' {} \;
    
por 01.05.2017 / 03:23
1
perl -i -lpe '$\=$"' file.data
  • -i ativa a edição no local.
  • -l conjuntos ORS = RS = "\n"
  • -p configura um arquivo de entrada implícito lido em + impressão automática de registros.
  • $\ é o ORS que está definido como $" = OFS = space by default .
  • É claro que você pode fornecer vários nomes de arquivos ao comando perl.
por 01.05.2017 / 04:56
0

Este é o comando sed que você está procurando:

find /directory/. -type f -exec sed -i ':begin;$!N;s/\n/ /;tbegin' {} \;
    
por 01.05.2017 / 04:02