AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 738970
Accepted
Brad
Brad
Asked: 2015-11-26 09:31:35 +0800 CST2015-11-26 09:31:35 +0800 CST 2015-11-26 09:31:35 +0800 CST

Anexar String usando perl/awk/sed?

  • 772

Estou tentando fazer o script de uma alteração no meu arquivo de configuração do apache (httpd.conf). Estou tentando combinar a seguinte string:

#
# DirectoryIndex: sets the file that Apache will serve if a directory

E ADICIONE o seguinte texto:

#
# Allow server status reports generated by mod_status,
# with the URL of http://servername/server-status
# Change the ".example.com" to match your domain to enable.
#
<Location /server-status>
    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from localhost ip6-localhost 127.0.0.1 192.168.0.0/255.255.255.0
</Location>

Meu entendimento é que o sed não suporta correspondências de várias linhas, o awk parece difícil de fazer correspondências de várias linhas. Estou tentando fazer o perl funcionar com perl -0777 -pi -e, mas não consigo descobrir uma expressão regular que corresponda ao padrão original.

Prefiro fazer isso como um liner - não como um script porque quero que seja portátil (ou seja, copie e cole conforme necessário).

Algum especialista em regex perl por aí que possa me ajudar a encontrar uma solução?

Muito obrigado antecipadamente Brad

EDITAR

As seguintes obras:

 sed -i -e ':begin;$!N;s/#\n# DirectoryIndex/#\n# Allow server status reports generated by mod_status,\n# with the URL of http:\/\/servername\/server-status\n# Change the ".example.com" to match your domain to enable.\n#\n<Location \/server-status>\n\tSetHandler server-status\n\tOrder deny,allow\n\tDeny from all\n\tAllow from localhost ip6-localhost 192\.168\.0\.0\/255\.255\.255\.0\n<\/Location>\n\n#\n\#DirectoryIndex/;tbegin;P;‌​D' /etc/httpd/conf/httpd.conf 

Mas não há espaço entre # e DirectoryIndex.

No entanto, se eu tentar alterá-lo para:

sed -i -e ':begin;$!N;s/#\n# DirectoryIndex/#\n# Allow server status reports generated by mod_status,\n# with the URL of http:\/\/servername\/server-status\n# Change the ".example.com" to match your domain to enable.\n#\n<Location \/server-status>\n\tSetHandler server-status\n\tOrder deny,allow\n\tDeny from all\n\tAllow from localhost ip6-localhost 192\.168\.0\.0\/255\.255\.255\.0\n<\/Location>\n\n#\n\# DirectoryIndex/;tbegin;P;‌​D' /etc/httpd/conf/httpd.conf 

O comando sed trava e nunca termina. Eu não consigo descobrir por quê?

A única diferença é um espaço entre # e DirectoryIndex.

perl
  • 2 2 respostas
  • 820 Views

2 respostas

  • Voted
  1. Froggiz
    2015-11-26T11:15:26+08:002015-11-26T11:15:26+08:00

    Você deveria tentar

    perl -0777 -i.original -pe 's/#\n# DirectoryIndex: sets the file that Apache will serve if a directory/#\n# DirectoryIndex: sets the file that Apache will serve if a directory\n#\n# Allow server status reports generated by mod_status,\n# with the URL of http:\/\/servername\/server-status\n# Change the ".example.com" to match your domain to enable.\n#\n<Location \/server-status>\n    SetHandler server-status\n    Order deny,allow\n    Deny from all\n    Allow from localhost ip6-localhost 127.0.0.1 192.168.0.0\/255.255.255.0\n<\/Location>/igs' /etc/httpd/conf/httpd.conf
    

    Não se esqueça de escapar sua string replace( \/for /) quando estiver usando / delimitador na ferramenta regexp

    Se você estiver executando por meio do shell, poderá fazer um script como esse

    #Set serach delimiter
    search='#\n# DirectoryIndex: sets the file that Apache will serve if a directory'
    
    #Set replace string from file
    replace=$search"\n"$(cat newConfFile)
    
    #Escape "/" char
    replace=${replace//\//\\\/ }
    
    #Launch the script
    perl -0777 -i.original -pe 's/${search}/${replace}/igs' /etc/httpd/conf/httpd.conf
    

    Com newConfFile contém a configuração do host virtual que você deseja adicionar

    Esta é uma função Bash para testar se existe uma função

    #return 0 if command exist else return 1
    canExec()
    {
    type "$1" &> /dev/null ;
    }
    

    por exemplo canExec sed, teste se o comando sed existe em seu sistema

    • 2
  2. Best Answer
    TessellatingHeckler
    2015-11-26T12:28:38+08:002015-11-26T12:28:38+08:00

    Com o awk, que tal:

    • armazenar cada linha em uma variável para "a linha anterior"
    • se a linha atual corresponder à segunda que você está procurando (DirectoryIndex), verifique a variável com a linha anterior
    • Se ambos combinarem
      • imprimir o bumpf
      • imprimir a 'linha atual'
      • imprima o '#' engolido
    • Senão
      • imprimir a linha atual
    • atualize a variável 'linha anterior' com a linha atual.

    Isso deve funcionar para você porque você não precisa estritamente PREPENDER o texto - já que tanto o texto que você está procurando quanto o texto que está inserindo começam com #você pode deixar o original #, insira seu texto menos a primeira #linha no meio, imprima a segunda linha original e imprima outra #para ser aquela que você não colocou no início.

    Você terá que preencher o texto completo, mas há o suficiente aqui para me convencer de que pode funcionar ;)

    gawk "{if (a==\"#\" && /^# DirectoryIndex/) {print \"# Allow Server\n#With the URL\n#\"; print $0} else {print $0}} {a=$0}" httpd.conf > ??
    

    (Minhas aspas duplas são para o prompt de comando do Windows. Ajuste conforme necessário).

    Citação editada para bash:

    gawk '{if (a=="#" && /^# DirectoryIndex/) {print "# Allow Server\n# With the URL\n#"; print $0} else {print $0}} {a=$0}' httpd.conf
    
    • 2

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve