Não é possível substituir a string por sed. Obtendo opção desconhecida

1

Estou tentando substituir uma string por sed (editor de fluxo), mas estou recebendo erros devolvidos. Provavelmente porque não estou usando a string corretamente, por causa dos símbolos.

Estou tentando substituir a seguinte string:

<VirtualHost |IP|:|PORT_80| |MULTI_IP|> 

com

<VirtualHost 127.0.0.1:8080 |IP|:8080 |MULTI_IP|>

No arquivo chamado virtual_host2.conf

Buw quando tento várias coisas, sempre recebo erros como:

sed: -e expression #1, char 90: unterminated 's' command
sed: -e expression #1, char 20: unknown option to 's'

Eu não sou tão experiente com sed , mas posso substituir as strings de texto normalmente. Mas eu acho que por causa dos símbolos na string atual, como | , < e > , não funciona como eu faria.

Alguém por favor pode me dar um exemplo de como substituir o anterior? Ou me aponte na direção certa.

Eu mesmo tentei o seguinte:

sed -i 's<VirtualHost |IP|:|PORT_80| |MULTI_IP|>/<VirtualHost 127.0.0.1:8080 |IP|:8080 |MULTI_IP|>' /virtual_host2.conf

sed -i 's|<VirtualHost |IP|:|PORT_80| |MULTI_IP|>|<VirtualHost 127.0.0.1:8080 |IP|:8080 |MULTI_IP|>|g' /virtual_host2.conf

Mas ambos apresentam o erro como mencionado acima.

Alguma ideia?

    
por Restafval 24.10.2017 / 09:31

1 resposta

2

Você omite / em sed 's///' padrão. Tente isto :

sed 's/<VirtualHost |IP|:|PORT_80| |MULTI_IP|>/<VirtualHost 127.0.0.1:8080 |IP|:8080 |MULTI_IP|>/' /virtual_host2.conf

E se tudo estiver ok, adicione a opção -i para executar a substituição real no arquivo.

A opção

g no padrão 's///g' realiza a substituição global de todas as ocorrências, não a primeira em cada linha.

Você pode usar alguns outros símbolos como delimitador, como 's|||' , mas não faz sentido em seu exemplo, porque é necessário citar cada símbolo | . Este comando receberá a mesma saída:

sed 's|<VirtualHost \|IP\|:\|PORT_80\| \|MULTI_IP\|>|<VirtualHost 127.0.0.1:8080 \|IP\|:8080 \|MULTI_IP\|>|' /virtual_host2.conf
    
por 24.10.2017 / 09:37

Tags