tabela sintaxe para remover 2 caracteres apenas quando for caixa e espaço

3

Eu tenho uma expressão sed para remover os dois primeiros caracteres de todas as linhas de um arquivo.

sed 's/^..//' raw.txt > converted.txt

No entanto, o problema é que algumas linhas são grandes e são adicionadas à próxima linha. Por exemplo, se eu considerar a entrada como nas linhas abaixo,

□ I have box and space in front
□ I am a large line which will
get appended to next line.
□ I am another line.

De acordo com minha sintaxe sed , estou obtendo a saída como

I have box and space in front
I am a large line which will
t appended to next line. 
I am another line. 

No entanto, a saída que estou esperando é,

I have box and space in front. 
I am a large line which will get appended to next line. 
I am another line. 

Como devo modificar a expressão sed para conseguir isso?

    
por Ramesh 19.02.2014 / 17:48

3 respostas

4
awk '
    {
        if (/^□ /) {
            if (prev_line) 
                print prev_line
            prev_line = substr($0, 3)
        } else {
            prev_line = prev_line " " $0
        }
    }    
    END {print prev_line}
' raw.txt
I have box and space in front
I am a large line which will get appended to next line.
I am another line.
    
por 19.02.2014 / 18:07
5

Pode ser mais fácil com awk :

awk '{
       if (/^□ /) printf "%s", (NR>1?"\n":"") substr($0,3)
       else printf " %s", $0
     }
     END {if (NR>0) print ""}'
    
por 19.02.2014 / 18:06
3

Se o seu arquivo não é enorme e você pode carregá-lo diretamente na memória, isso deve funcionar:

$ perl -000pe 's/\n([^□])/ $1/g; s/^□ //mg;' raw.txt 
I have box and space in front
I am a large line which will et appended to next line.
I am another line.

O -000 ativa o modo de parágrafo e (supondo que não haja novas linhas consecutivas no arquivo) carregará o arquivo inteiro na variável especial $_ . Em seguida, você faz as substituições necessárias e o -p faz com que $_ seja impresso automaticamente.

    
por 19.02.2014 / 19:24

Tags