Apague até a primeira ocorrência, edite essa linha e imprima as linhas restantes inalteradas [closed]

1

Eu tenho abaixo o texto:

add gmt version date
comment - text1
text1 continue
comment - text2
text2 continue
comment - text 3
text3 continue

Eu quero todo o texto da primeira ocorrência de "comentário" para o final do arquivo. Eu estava usando sed 's/^.*Comment - //g' estou ficando apenas abaixo do texto:

 text 3
 text3 continue

i.e. da última ocorrência de "comentário" para o final do arquivo. mas eu preciso de todo o texto da primeira ocorrência de "comentário" para o final do texto, ou seja,

    text1
    text1 continue
    comment - text2
    text2 continue
    comment - text 3
    text3 continue
    
por user746184 09.02.2017 / 13:19

2 respostas

0

Feito com um cachimbo, mas não é muito legal

$ sed -n '/comment/,$ p' file | sed -r '0,/comment/ s/comment - (.*)//'
text1
text1 continue
comment - text2
text2 continue
comment - text 3
text3 continue
Explicação
  • sed -n '/comment/,$ p' file linhas de impressão de comment até o final
  • sed -r '0,/comment/ s/comment - (.*)//' encontra a primeira linha com comment e edita para remover comment -
por 09.02.2017 / 13:41
1

A maneira mais fácil de fazer isso com sed é por meio do agrupamento de comandos:

{ sed '/PATTERN/!d;s///;q'; cat; } <infile

d elimina todas as linhas que não correspondem, na primeira corresponde a s ubstitutes por sua solicitação e sai (impressão automática), então cat assume e imprime as linhas restantes, se houver.
Não quer dizer que você não pode fazer isso com sed sozinho:

sed '/PATTERN/,$!d         # delete all lines not in this range
//{                        # if the line matches
x;//!{                     # exchange and IF what was in hold space doesn't match
g;s///;b                   # get hold space content, replace, go to end of script
}
x                          # ELSE exchange back (do nothing)
}' <infile

Eu usei PATTERN para simplificar (substitua por ^.*comment - ou qualquer que seja o padrão).

    
por 09.02.2017 / 14:10