Como substituir texto entre duas strings únicas no arquivo?

1

Em requirements.txt , desejo substituir a ramificação / commit que pode conter barras, traços e outros caracteres potencialmente especiais que podem precisar de escape:

-e [email protected]:acme-inc/repo0.git@master#egg=repo0
-e [email protected]:acme-inc/repo1.git@master#egg=repo1
-e [email protected]:acme-inc/repo2.git@master#egg=repo2

Um exemplo de objetivo é substituir o conteúdo entre @ e # por um ramo ou confirmação arbitrária. Por exemplo:

-e [email protected]:acme-inc/repo0.git@my/branch/0#egg=repo0
-e [email protected]:acme-inc/repo1.git@1234567#egg=repo1
-e [email protected]:acme-inc/repo2.git@my/branch-2#egg=repo2

Isso NÃO está produzindo a 0ª linha da meta desejada:

sed -i 's/(repo0.git@).*(#)/"my/branch/0"/' testfile.txt

Relacionados:

link

link

Sed substitui entre 2 cordas com caractere especial

    
por tarabyte 27.10.2015 / 21:44

1 resposta

2

Para substituir os caracteres entre @ e # com my/branch , use o seguinte:

$ sed -e 's!@[^@]*#!@my/branch#!' foo.txt
-e [email protected]:acme-inc/repo0.git@my/branch#egg=repo0
-e [email protected]:acme-inc/repo1.git@my/branch#egg=repo1
-e [email protected]:acme-inc/repo2.git@my/branch#egg=repo2

Observação: o [^@]* garante que você corresponda ao @ mais próximo e não ao primeiro.

Como suas necessidades exatas não são claras, suponho que você queira trocar master por my\branch .

As substituições em sed são delimitadas pelo primeiro caractere após s . Usar um caractere que não ocorra em sua string (como ! ) pode ser mais fácil de seguir.

$ sed -e 's!master!my/branch!' foo.txt
-e [email protected]:acme-inc/repo0.git@my/branch#egg=repo0
-e [email protected]:acme-inc/repo1.git@my/branch#egg=repo1
-e [email protected]:acme-inc/repo2.git@my/branch#egg=repo2

Como alternativa, você pode escapar da barra \/ para que sed não tente delimitá-la.

$ sed -e 's/master/my\/branch/' foo.txt
-e [email protected]:acme-inc/repo0.git@my/branch#egg=repo0
-e [email protected]:acme-inc/repo1.git@my/branch#egg=repo1
-e [email protected]:acme-inc/repo2.git@my/branch#egg=repo2
    
por 27.10.2015 / 22:24

Tags