pt + remover caractere no primeiro jogo ou no segundo jogo

0

a seguinte sintaxe de sed remove o "#" na linha "Exigir tudo concedido"

   sed 's/#\([[:space:]]*Require all granted\)/ /' graphite-web.conf

   #<IfModule mod_authz_core.c>
   #    # Apache 2.4
   #    Require local
   #    Order Allow,Deny
   #    Allow from All
        Require all granted
   #</IfModule>
   #<IfModule !mod_authz_core.c>
   #    # Apache 2.2
        Require all granted
   #    Order Allow,Deny
   #    Deny from all
   #    Allow from All
   #    Allow from ::1
   #</IfModule>

como mudar a sintaxe do sed para remover o "#" no primeiro jogo? ou para o segundo jogo?

resultado esperado:

   #<IfModule mod_authz_core.c>
   #    # Apache 2.4
   #    Require local
   #    Order Allow,Deny
   #    Allow from All
        Require all granted
   #</IfModule>
   #<IfModule !mod_authz_core.c>
   #    # Apache 2.2
   #    Require all granted
   #    Order Allow,Deny
   #    Deny from all
   #    Allow from All
   #    Allow from ::1
   #</IfModule>

ou

   #<IfModule mod_authz_core.c>
   #    # Apache 2.4
   #    Require local
   #    Order Allow,Deny
   #    Allow from All
   #    Require all granted
   #</IfModule>
   #<IfModule !mod_authz_core.c>
   #    # Apache 2.2
        Require all granted
   #    Order Allow,Deny
   #    Deny from all
   #    Allow from All
   #    Allow from ::1
   #</IfModule>
    
por yael 31.10.2017 / 05:29

4 respostas

0

Use awk em vez

$ cat ip.txt 
   #    Allow from All
   #    Require all granted
   #    # Apache 2.2
   #    Require all granted
   #    Order Allow,Deny
   #    Require all granted
   #    Order Deny

$ awk '/#[[:space:]]*Require all granted/ && ++c==1{sub("#", " ")} 1' ip.txt
   #    Allow from All
        Require all granted
   #    # Apache 2.2
   #    Require all granted
   #    Order Allow,Deny
   #    Require all granted
   #    Order Deny

$ awk '/#[[:space:]]*Require all granted/ && ++c==2{sub("#", " ")} 1' ip.txt
   #    Allow from All
   #    Require all granted
   #    # Apache 2.2
        Require all granted
   #    Order Allow,Deny
   #    Require all granted
   #    Order Deny

$ awk '/#[[:space:]]*Require all granted/ && ++c>1{sub("#", " ")} 1' ip.txt
   #    Allow from All
   #    Require all granted
   #    # Apache 2.2
        Require all granted
   #    Order Allow,Deny
        Require all granted
   #    Order Deny

Veja também awk salvar modificações no lugar


Ou usando perl

$ # for inplace editing, use perl -i -pe
$ perl -pe 's/#/ / if /#\s*Require all granted/ && ++$c==1' ip.txt
   #    Allow from All
        Require all granted
   #    # Apache 2.2
   #    Require all granted
   #    Order Allow,Deny
   #    Require all granted
   #    Order Deny
    
por 31.10.2017 / 07:08
0

Ou sed approach:

sed ':a;N;$!ba;s/#\([[:space:]]*Require all granted\)/ /2' graphite-web.conf

Se o arquivo de entrada contiver:

#<IfModule mod_authz_core.c>
   #    # Apache 2.4
   #    Require local
   #    Order Allow,Deny
   #    Allow from All
   #    Require all granted
   #</IfModule>
   #<IfModule !mod_authz_core.c>
   #    # Apache 2.2
   #    Require all granted
   #    Order Allow,Deny
   #    Deny from all
   #    Allow from All
   #    Allow from ::1
   #</IfModule>

A saída será:

#<IfModule mod_authz_core.c>
   #    # Apache 2.4
   #    Require local
   #    Order Allow,Deny
   #    Allow from All
   #    Require all granted
   #</IfModule>
   #<IfModule !mod_authz_core.c>
   #    # Apache 2.2
        Require all granted
   #    Order Allow,Deny
   #    Deny from all
   #    Allow from All
   #    Allow from ::1
   #</IfModule>

Esse padrão :a;N;$!ba; lê todas as linhas (como um loop while) antes do final do arquivo e depois que o eof chegou, execute substituindo s///2 da segunda ocorrência.

A melhor explicação dos rótulos sed que você pode ler em Qual é o significado de: a; $! N; em um comando sed?

E leia um tópico semelhante Como substituir a enésima ocorrência de uma string usando sed

    
por 31.10.2017 / 07:40
0

Sed foi criado para funcionar em fluxos. Uma maneira fácil de realizar o que você deseja é usar ed :

ed -s graphite-web.conf <<<$'/Require all/s/#/ /\nw'

Atualização: Eu posso entrar em detalhes sobre ed , mas esta página explica ed e seu uso extensivo em muito mais detalhes.

Minha explicação para esta linha é:

-s significa bastante. Não mostre o que mudamos.

Em seguida, usamos herestring <<< e aplicamos a forma de cotação ANSI C $'' , na qual as combinações de caracteres de barra invertida são expandidas. \nw significa que adicionamos uma nova linha e gravamos no arquivo.

    
por 31.10.2017 / 10:28
0

Aqui está uma ex versão ... setar a variável shell x para um número indicando a ocorrência a ser alterada (por exemplo, com x=2 o comando modificará a segunda ocorrência do padrão) ...

Este atualiza o arquivo de entrada no local:

ex +'/#\(\s*Require all granted\)/|1' +"norm ${x}n" +'s// /|wq' file 

Aqui está uma variante canalizada que não modifica o arquivo, mas imprime a versão modificada para stdout :

cat file | ex +'/#\(\s*Require all granted\)/|1' +"norm ${x}n" +'s// /' +'%p|q!' /dev/stdin

Detalhes:

Quando não estiver sendo executado de forma interativa, ex é essencialmente uma versão em lote, centralizada no cmdline, de vim . Muito disso deve ser familiar para vim users ...

  • /#\(\s*Require all granted\)/|1 - procure o padrão e vá para a linha 1 para "redefinir"
  • norm ${x}n - vai a ocorrência n ext do padrão x times
  • s// /|wq - faça a substituição na linha atual somente depois escreva-quit
por 31.10.2017 / 19:09

Tags