como remover duas barras em um comentário com sed

3

Eu tenho um arquivo de configuração e quero substituir uma linha contendo uma string específica, digamos test :

file.conf

aaa
bbb
ccc
// test
ddd
// test

Minha linha de código não está funcionando. Sou novo em sed .

sed -i 's#^//[ \t]test#test#g'

Alguma orientação?

    
por neuraload 30.01.2013 / 13:23

2 respostas

3

Antes de tudo, recomendo evitar o uso de -i , pois ele substituirá os arquivos no local sem confirmação.

Esta é uma versão funcional do que você estava tentando realizar e produz a saída padrão (o terminal):

sed 's#^//[ \t]test$#test#g' file.conf
aaa
bbb
ccc
test
ddd
test

Opcionalmente canalize-o através de menos anexando | less para poder paginar através de grandes quantidades de saída.

O acima é muito específico para a sequência de test , então, para generalizar mais, você pode tentar isto:

sed 's#^//\s\(.*\)$##g' file.conf

Ele removerá a parte // e todos os espaços em branco até o texto real, qualquer que seja este texto.

Se você gostar do resultado, poderá adicionar o sinalizador -i novamente para substituir o arquivo.

Para saber mais sobre sua tentativa e explicar por que meu exemplo funciona:

sed -i 's#^//[ \t]test#test#g'
  • Você está usando um backtick (') que é interpretado pelo seu shell em vez de Sed. Uma simples aspa simples ( ' ) deveria ter sido usada aqui provavelmente.
  • Os hashes ( # ) são o seu delimitador escolhido, uma boa alternativa à barra comum ( / ), já que sua correspondência é sobre esse mesmo caractere e isso evita a necessidade de escape.
  • O padrão no comando s/regexp/replacement/ é padrão, como mencionado na manpage, entre muitos outros: man 1 sed :

      

    s/regexp/replacement/

         

    Tente corresponder o regexp ao padrão   espaço. Se tiver êxito, substitua a parte correspondente à substituição.   A substituição pode conter o caractere especial & para se referir a   parte do espaço padrão que combinou, e as fugas especiais    a para se referir à correspondência correspondente   subexpressões no regexp.

  • rexexp acima é uma abreviação comumente usada para expressões regulares .
  • A expressão regular ^//[ \t]test$ corresponde a linhas iniciando ( ^ ) com duas barras, seguido por um espaço ou um caractere de tabulação, seguido pela sequência exata test e uma terminação de linha ( $ ).
  • O g sinalizador é para fazer essa operação de maneira global, conforme explicado aqui .
  • Um arquivo de entrada está faltando e deve ser fornecido após o comando Sed.
por gertvdijk 30.01.2013 / 13:34
2

Você não precisa usar barras como separador. Na verdade, recomendo usar outros separadores como vírgula ou hashes para facilitar a leitura.

-i também é seu amigo, mas use-o apenas se tiver certeza de que está correto. Nesse caso, eu faria algo como:

sed -r 's,^//[ \t]*(.+),,' file.conf | less

Eu uso -r aqui para o regexp estendido, então não preciso escapar dos parênteses. Além disso, permite-me usar o operador plus, que significa "uma ou mais ocorrências". A seguinte expressão seria equivalente:

sed 's,^//[ \t]*\(..*\),,' file.conf | less

(um ponto para corresponder a pelo menos um caractere seguido por zero ou mais de qualquer caractere)

Depois de ter certeza de que a substituição está correta (digite barra seguida de suas palavras-chave em less para pesquisa), fecho menos digitando q e navegue até a entrada do histórico anterior pressionando a tecla Para cima. Em seguida, excluo | less e digite -i para prosseguir com a substituição:

sed -r 's,^//[ \t]*(.+),,' file.conf -i

Se você quiser ter uma compreensão mais profunda do sed, recomendo que você leia a página de informações do sed, que é mais extensa que a página de manual:

info sed
    
por Lekensteyn 30.01.2013 / 14:32

Tags