torr / awk faz com que as linhas que começam com caracteres menores sejam mescladas à linha anterior

2

Aqui está o que tenho

This
is
a
sample
text

How
to
do
it
?

Eu preciso que a saída seja:

This is a sample text
How to do it ?

Além disso, como posso alcançar o mesmo com:

This
is
a
sample
text
How
to
do
it
?

Como anexar linhas que começam com caracteres não maiúsculos para serem anexados à linha anterior?

    
por Mina Mohsen 08.03.2013 / 18:25

5 respostas

3
sed -r ':a;N;$!ba;s/\n([^A-Z])/ /g'

:a crie um rótulo b

N Pesquise todas as linhas reunidas em vez de pesquisar linha por linha

$! se não for a última linha, b branch (ir para) label a (pule a última linha porque a última linha tem uma nova linha final)

s de substituição

\n\([^A-Z]\) corresponde a uma nova linha seguida de qualquer coisa que não seja uma letra maiúscula. O grupo ( e ) juntos nada é uma letra maiúscula.

/ /' substitui a nossa correspondência por um espaço seguido pelo grupo 1

g copia o conteúdo do buffer de retenção para o espaço de padrão

O crédito pertence aqui e aqui e aqui .

    
por Grimtech 08.03.2013 / 19:12
3

Considerando que algumas frases podem incluir palavras em maiúsculas, talvez essa seja a solução que você está procurando:

sed -n '
1h
1!H
$ {
        g
        s/\n\n/<br>/g
        p
}
' | \
sed -n '
1h
1!H
$ {
        g
        s/\n/ /g
        p
}
' | \
sed -e 's/<br>/\n/g'
    
por Sadi 08.03.2013 / 18:43
3

bash builtins é a maneira mais rápida :-)

declare -a A
mapfile -t A <inputFile
for line in "${A[@]}"
do
  if [ -n "${line}" ]
  then
     if [ "${line}" = "${line^}" ]
     then
         echo -en "\n${line} "
     else
         echo -n "${line} "
     fi      
 else 
    echo "" # newline, because input line was empty
  fi
done   
    
por H.-Dirk Schmitt 08.03.2013 / 18:37
1

Que tal um bash one-liner?

while read L; do case $L in [A-Z]*) echo ;; esac; echo -n "$L "; done; echo
    
por zwets 08.03.2013 / 19:38
0

Com a primeira amostra:

awk '{=}1' RS= file

com a segunda amostra:

awk '/^[[:upper:]]/{print x}1' file | awk '{=}1' RS=
    
por Scrutinizer 09.03.2013 / 14:39