pt remove final de linha para linhas específicas

4

Estou tentando encontrar o comando sed para remover o final da linha (ou seja, obter a próxima linha para a corrente), mas somente se a linha começar com a cadeia NOTOK.

exemplo de entrada:

   NOTOK something detected
        details are                : some info

a saída deve ser:

NOTOK something detected        details are                : some info
    
por Tom Klino 01.01.2014 / 15:52

4 respostas

2

com o awk:

awk '$1 == "NOTOK" {printf "%s", $0; next} 1' file
    
por 01.01.2014 / 16:07
5
sed '/NOTOK/ { N; s/\n// }'

Se a sua implementação sed não suporta ; para separar comandos (o GNU sed faz, mas não é padrão):

sed -e '/^NOTOK/ {' -e 'N' -e 's/\n//' -e '}'

Sed fica enigmático muito rapidamente; qualquer coisa que seja mais complexa que um ou mais comandos s é um bom candidato para o awk.

awk '/^NOTOK/ {printf "%s", $0; next} 1 {print}'

ou

awk '/NOTOK/ {getline n; $0 = $0 n} 1'
    
por 02.01.2014 / 01:43
1

Unindo linhas com ed :

cat <<-'EOF' | ed -s file
H
$a

.
,g/^[[:space:]]*NOTOK/.,.+1j
,p
q
EOF

(Nota: use w em vez de ,p para edição de arquivos no local).

    
por 02.01.2014 / 15:33
1

Aqui estão alguns:

  • Perl

    perl -pe 'chomp if /^\s*NOTOK/' file
    

    O -p flag do perl faz com que ele imprima cada linha do arquivo de entrada, o -n significa arquivos de leitura linhas por linha e aplica o script fornecido por -e . chomp() é uma função que simplesmente remove a nova linha ( \n ) do final de uma linha, portanto, nós apenas copiamos se a linha começar com NOTOK ( /^NOTOK/ ).

  • awk

    awk '{if($1~/NOTOK/){printf "%s", $0}else{print}}' file
    

    ou

    awk '$1~/NOTOK/{printf "%s", $0; next}1;' file
    

    $1 é o primeiro campo em awk . Se corresponder a NOTOK , imprimiremos a linha sem nova linha no final ( printf ), caso contrário, imprimiremos a linha como está.

  • bash

    while IFS="" read line; do 
      if [ $(expr index "$line" "NOTOK") -gt "0" ]; then printf "$line";       
      else echo "$line"; fi;
    done < file
    

    IFS é o separador de campos de entrada que precisa ser definido como em branco para ler linhas inteiras (caso contrário, obteria apenas a primeira palavra). Assim, lemos cada linha do arquivo em $line , depois verificamos se essa linha começa com NOTOK e imprimimos sem uma nova linha no final (printf) ou com (eco) de acordo.

por 01.01.2014 / 16:25