Para remover linhas novas depois da linha vazia

3

Dados

4. Alendronic acid
A. Antiosteoporotic agent. 
B. Inhibit osteoclast formation and function by inhibiting FPPS enzyme, so increase bone mass. 
C. Osteoporosis in combination with vitamin D. 

5. Aminophylline
A. Methylxanthine. Less potent and shorter-acting bronchodilator than Theophylline. 
B. Phosphodiesterase (PDE) inhibitor, so increase cAMP so affecting calcium so relaxes respiratory SM and dilates bronchi/bronchioles. 
C. Last option of asthma attack, COPD, Reversible airways obstruction. 

que eu quero ser (e depois sem a linha vazia como no pseudocódigo abaixo)

4. Alendronic acid
A. Antiosteoporotic agent. B. Inhibit osteoclast formation and function by inhibiting FPPS enzyme, so increase bone mass. C. Osteoporosis in combination with vitamin D. 

5. Aminophylline
A. Methylxanthine. Less potent and shorter-acting bronchodilator than Theophylline. B. Phosphodiesterase (PDE) inhibitor, so increase cAMP so affecting calcium so relaxes respiratory SM and dilates bronchi/bronchioles. C. Last option of asthma attack, COPD, Reversible airways obstruction. 

Minha tentativa foi originalmente baseada na ideia de remover todas as linhas vazias por gsed -n "s/^$//;t;p;" , mas isso não é possível agora.

Pseudocódigo

  • remova todas as linhas novas (não as linhas vazias) por tr '\n' ' ' (tudo agora um forro, mas problema, pois também leva linhas vazias!)
  • substitua todos os A. por \ nA. por sed 's#A.#\nA.#'
  • remover todas as linhas vazias por gsed -n "s/^$//;t;p;"

Pseudocódigo em resumo

cat                                 \
     10.6.2015.tex                  \
                                    \
| tr '\n' ' '                       \
                                    \
| sed 's#A.#\nA.#'                  \
                                    \
| gsed -n "s/^$//;t;p;"             \
                                    \
> 10.6.2015_quizlet.tex

que, no entanto, está errado devido ao erro lógico na primeira linha.

Como pode remover linhas novas após a linha vazia em Perl / Sed / tr?

    
por Léo Léopold Hertz 준영 08.06.2015 / 22:58

4 respostas

2

Eu usaria perl ou awk para ler os dados um parágrafo por vez e remover todos, exceto a primeira nova linha:

perl -00 -pe '$\="\n\n"; s/\n/
perl -00 -pe '   # each record is separated by blank lines (-00)
                 # read the file a record at a time and auto-print (-p)
    $\="\n\n";   # auto-append 2 newlines to each record
    s/\n/
awk -v RS= -F'\n' '{print $1; for (i=2; i<=NF; i++) printf "%s", $i; print ""; print ""}' file
/; # turn the first newline into a null byte s/\n//g; # remove all other newlines s/
perl -00 -pe '$\="\n\n"; s/\n/
perl -00 -pe '   # each record is separated by blank lines (-00)
                 # read the file a record at a time and auto-print (-p)
    $\="\n\n";   # auto-append 2 newlines to each record
    s/\n/
awk -v RS= -F'\n' '{print $1; for (i=2; i<=NF; i++) printf "%s", $i; print ""; print ""}' file
/; # turn the first newline into a null byte s/\n//g; # remove all other newlines s/%pre%/\n/ # restore the first newline ' file
/; s/\n//g; s/%pre%/\n/' file
/\n/ # restore the first newline ' file
/; s/\n//g; s/%pre%/\n/' file

Comentou

%pre%

Similarmente

%pre%     
por 09.06.2015 / 01:15
2

Você pode usar:

sed '/[0-9]\./{n;:l;N;/\n$/!s/\n/ /;t l}' file

Isso produzirá:

4. Alendronic acid
A. Antiosteoporotic agent.  B. Inhibit osteoclast formation and function by inhibiting FPPS enzyme, so increase bone mass.  C. Osteoporosis in combination with vitamin D. 

5. Aminophylline
A. Methylxanthine. Less potent and shorter-acting bronchodilator than Theophylline.  B. Phosphodiesterase (PDE) inhibitor, so increase cAMP so affecting calcium so relaxes respiratory SM and dilates bronchi/bronchioles.  C. Last option of asthma attack, COPD, Reversible airways obstruction. 

Explicação

Nós combinamos a linha com o número e o período com /[0-9]\./ . Em seguida, inserimos um bloco de código, que vai para a próxima linha com n . Ele inicia um loop com :l , que anexa a próxima linha com N e substitui a nova linha por um espaço com s/\n/ / . O loop termina quando atinge uma linha vazia, que é captada pela condição /\n$/! .

    
por 08.06.2015 / 23:08
2

Aqui está uma solução awk que resolve o problema por meio de definições apropriadas do que é o campo e separadores de registro para entrada e saída; assim, o comando efetivo ( $1=$1 FS ) é bem simples:

awk '
  BEGIN { RS="" ; FS="\n" ; OFS="" ; ORS="\n\n" }
  $1=$1 FS
'

Explicação:

RS="" - processará blocos de dados separados por linha vazia como um registro

FS="\n" - definirá cada linha de um bloco como um campo endereçável próprio

OFS="" - devido a dados terminados em branco, nenhum separador de campo de saída é necessário

ORS="\n\n" - para separar os novos blocos (como os dados de entrada) por uma linha em branco

$1=$1 FS - o primeiro campo (ou seja, a primeira linha) será separado do resto das linhas no bloco por um caractere de nova linha; como essa atribuição é uma condição verdadeira em awk , o registro modificado (bloco) será impresso

    
por 09.06.2015 / 05:04
1
sed -n '/^[0-9]/!H;//x;$x;s/\n\([^A]\)/ /gp' <infile >outfile

Parece fazer o truque:

  1. %código%
    • Se uma linha /^[0-9]/!H não começar com um dígito, anexe-a ao ! old space depois de um H ewline.
  2. %código%
    • Se começar com um dígito e / ou se esta for a linha \n last, e //x;$x padrão de alteração e $ espaços antigos.
  3. %código%
    • Se 1 ou mais sequências de um x ewline seguidas por qualquer caracter não- A puderem ser encontradas no espaço padrão, então h lobally s/\n\([^A]\)/ /gp ubstitute as \n ewlines em essas sequências para um < espaço > e g rint os resultados.
    • A única vez que um s/// ewline será encontrado é imediatamente após uma alteração de e \n - portanto, apenas nas linhas que começam com um dígito ou a última linha.
    • O dígito inicial consegue reter seu p ewline porque a linha de separação é o caractere último no espaço padrão quando ocorre a alteração e \n - e, portanto, não há caractere x para segui-lo e, assim, ele não obtém \n ubstituído por um espaço.

E isso é tudo.

OUTPUT:

4. Alendronic acid
A. Antiosteoporotic agent.  B. Inhibit osteoclast formation and function by inhibiting FPPS enzyme, so increase bone mass.  C. Osteoporosis in combination with vitamin D. 

5. Aminophylline
A. Methylxanthine. Less potent and shorter-acting bronchodilator than Theophylline.  B. Phosphodiesterase (PDE) inhibitor, so increase cAMP so affecting calcium so relaxes respiratory SM and dilates bronchi/bronchioles.  C. Last option of asthma attack, COPD, Reversible airways obstruction. 
    
por 09.06.2015 / 10:23