Ao processar o texto, preciso remover o caractere de nova linha a cada duas linhas.
Texto de amostra:
this is line one
and this is line two
the third and the
fourth must be pasted too
Saída desejada:
this is line one and this is line two
the third and the fourth must be pasted too
Eu tentei um while
loop, mas um loop while é uma prática ruim. É possível fazê-lo usando tr
ou qualquer outro comando?
text-processing
jomaweb
fonte
fonte
Respostas:
paste
(também um utilitário simples padrão do POSIXtr
) é sua ferramenta para isso.Supondo que você queira que esses caracteres de nova linha sejam substituídos por um espaço em vez de apenas removidos, como na sua amostra:
Ou:
Substitua
' '
por'\0'
se você realmente deseja removê-los.Para substituir 2 de 3:
1 de 3, começando com o segundo:
E assim por diante.
Outra coisa boa
paste
é que ela não deixará uma linha não terminada. Por exemplo, se você remover todas as novas linhas de um arquivo (como comtr -d '\n' < file
outr '\n' ' ' < file
), você acaba sem nenhuma linha, pois as linhas precisam ser finalizadas com um caractere de nova linha. Portanto, geralmente é melhor usarpaste
isso (como empaste -sd '\0' file
oupaste -sd ' ' file
) que adicionará o caractere de nova linha à direita necessário para ter um texto válido.fonte
Com o moderno GNU sed
E awk
fonte
sed
abordagem significa reduzir o arquivo inteiro na memória (desde que ele não contenha NUL bytes) e fazer alguma substituição cara de regexp. Não vejo o benefício sobre ased 'N;s/\n/ /'
abordagem padrão .Use
sed
para isso como mostrado abaixo:fonte
Outra maneira é usar
xargs
:Onde
Embora essa solução seja bastante excessiva porque um
echo
processo é executado para cada linha ... Portanto, além dos exemplos de brinquedos, uma solução baseada em awk / sed ou similar deve ser preferida.fonte
echo
implementação, você também terá problemas com caracteres de barra invertida ou algumas linhas que começam com-
(como--help
ou-nene
com o GNUecho
). Observe também que-d
é uma extensão GNU.echo
, você pode usar o seguinte:< txt xargs -d '\n' -n 2 printf -- '%s %s\n'
Na verdade, isso é extremamente simples no vim. Para unir todas as linhas, use o
J
comando e, em seguida, use o%norm
comando para aplicá-lo a todas as linhas simultaneamente. Por exemplo(Caso você não esteja familiarizado com o vim,
<CR>
apenas significa entrar)Isso funciona mesmo para unir um número arbitrário de linhas. Por exemplo, unir a cada dez linhas seria
Se você não se sente à vontade com o vim e prefere usá-lo como uma ferramenta de linha de comando, em vez de um editor de texto interativo, você pode:
fonte
Isso imprime cada linha,
$0
seguida por um espaço ou uma nova linha, dependendo do número da linhaNR
, ser ímpar ou par.A expressão
NR%2?" ":"\n"
é uma declaração ternária. A expressão éNR%2
avaliada como verdadeira (diferente de zero) se o número da linha for ímpar. No caso, a expressão ternária retorna um espaço. Se for avaliado como falso (zero), a nova linha será retornada.Alternativo
Como sugerido por Costas nos comentários:
Aqui, a instrução ternária
NR%2?" ":RS
é usada para retornar um espaço ou o separador de registro de entrada (RS
, padrão = nova linha). Este valor é atribuído ao separador de registros de saídaORS
,. O1
final do comando é a abreviação enigmática do awk para imprimir o registro.fonte
()
parênteses e o espaço depoisprintf
;)'NR%2{printf("%s ",$0);next}1'
'{ORS=(NR%2?" ":RS)}1'
ORS
solução.Solução genérica, substitua
5
pelo número de linhas necessáriasfonte
Você pode usar
awk
para isso:Produz:
Onde:
As
awk
ações são executadas para cada linha, a variável especial$0
referencia a linha atual,NR
é o número da linha atual (começando em 1). A segunda ação é protegida pela expressãoNR%2
, que é a operação do módulo. Assim,c=" "
só é executado seNR%2
for verdadeiro, ou seja, para números de linhas ímpares.A
awk
sintaxe é semelhante a C, mas alguns elementos são opcionais em alguns contextos - por exemplo, ponto e vírgula.fonte
c
variável éORS
:'NR%2{ORS=" "}1;{ORS=RS}'
Usando
ed
:Os
ed
comandos de edição, para cada linha (g
aplica um conjunto de comandos de edição a todas as linhas correspondentes à expressão regular especificada), adicionam um caractere de espaço ao final e o associam à próxima linha. Em seguida, ele grava o texto resultante em um arquivo chamadotext.new
.fonte
Com Ruby.
Presumo que cada bloco de
n
linhas deve ser unido. Suponha quen = 3
o arquivo de entrada seja'infile'
e os resultados sejam gravados no arquivo'outfile'
.Construir um arquivo
Confirme o conteúdo do arquivo
Remova novas linhas e grave no arquivo
Confirmar conteúdo
fonte
ruby
é off-topic sobre U&L. Mas, como você o está usando na linha de comandoruby -e
, isso o torna bastante tópico.