Sed - substitui um caractere em uma linha combinada?

18

Em um arquivo que contém linhas como esta:

# lorem ipsum blah variable

Eu gostaria de remover o caractere # (comentário) na mesma linha que contém uma string específica, no lugar. sed é bom para isso?

Estou com dificuldades para conseguir esse trabalho condicional. Eu tenho uma maneira "desajeitada" de fazer isso; Eu posso encontrar o número da linha correspondente com awk ou sed e, em seguida, usar esse número em um comando sed separado, mas acredito que isso pode ser feito de uma maneira muito melhor.

    
por Kamil 12.09.2014 / 22:22

3 respostas

31

Use a string que você está procurando como o seletor para as linhas a serem operadas:

sed '/ipsum/s/#//g'

/ipsum/ seleciona linhas contendo "ipsum" e somente nessas linhas o comando (s) a seguir é executado. Você pode usar chaves para executar mais comandos

/ipsum/{s/#//g;s/@/-at-/g;}
    
por 12.09.2014 / 23:32
7
$ cat input.txt
# lorem ipsum blah variable
# lorem ipsum blat variable
# lorem ipsum blow variable
# lorem ipsum blip variable
# lorem ipsum blue variable

então:

$ sed 's|# \(.*blue.*\)||' input.txt

dá:

# lorem ipsum blah variable
# lorem ipsum blat variable
# lorem ipsum blow variable
# lorem ipsum blip variable
lorem ipsum blue variable

Funciona da seguinte forma:

O s informa sed que deve substituir o que a expressão regular encontra.

O padrão é # \(.*blue.*\) , que se divide em: Encontre um hash seguido por um espaço. O colchete ( \( ) inicia o agrupamento. .*blue.* é a palavra blue com qualquer coisa antes e depois. O próximo colchete ( \) ) fecha o agrupamento.

A substituição é , que é uma referência inversa ao conteúdo do primeiro intervalo de agrupamento.

    
por 12.09.2014 / 22:38
2

Você pode usar o Vim no modo Ex:

ex -sc '/ipsum/s/#//|x' file
  1. s substituto

  2. x salvar e fechar

por 17.04.2016 / 07:48

Tags