Quando apliquei sed -i -e "s/..\///" -e "s/type_properties\///" testfile
ao seguinte arquivo:
#include "../../../../include/concepts/type_properties/operations/has_or_op_v.hpp"
int main() {
// Test has_not_op_v.
}
Ele produz isso:
#include "../../../include/concepts/operations/has_or_op_v.hpp"
int main() {
/ Test has_not_op_v.
}
Eu só queria que o sed excluísse um ../
e type_properties/
excluísse , mas também estragou minha anotação.
O personagem
.
é um metacaractere . Isso significa que tem um significado especial..
significa "corresponder a qualquer letra ou caractere". Você deseja corresponder apenas a.
caracteres literais.Se você alterar
.
para\.
, obterá a saída correta.Exemplo:
torna-se:
Em primeiro lugar, não use
sed -i
ao testar as coisas. Execute sem-i
primeiro e examine o resultado. Quando você souber que parece certo , adicione-i
para confirmar a alteração no arquivo no local.A razão
sed
parece fazer mais do que o solicitado é que o comentário namain()
função corresponde à primeira de suas duas expressões..\/
(dois caracteres e uma barra).Se você sabe que deseja aplicar sua alteração apenas a linhas que começam com
#include
, pode usarAqui, as duas substituições são realizadas apenas em linhas que começam com a string
#include
. Eu também escapei adequadamente os dois pontos na primeira expressão para que eles correspondam aos pontos, não a "qualquer caractere". Como o texto que estamos correspondendo contém barras, também optei por usar um delimitador alternativo,%
, noss
comandos.