1

В requirements.txt я хочу заменить ветвь / фиксацию, которая может содержать прямые косые черты, тире и другие потенциально специальные символы, которые могут нуждаться в экранировании:

-e git@github.com:acme-inc/repo0.git@master#egg=repo0
-e git@github.com:acme-inc/repo1.git@master#egg=repo1
-e git@github.com:acme-inc/repo2.git@master#egg=repo2

Примерная цель - заменить содержимое между @ и # произвольной ветвью или коммитом. Например:

-e git@github.com:acme-inc/repo0.git@my/branch/0#egg=repo0
-e git@github.com:acme-inc/repo1.git@1234567#egg=repo1
-e git@github.com:acme-inc/repo2.git@my/branch-2#egg=repo2

Это НЕ производит 0-ую строку желаемой цели:

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

Связанные с:

http://www.grymoire.com/Unix/Sed.html#uh-62h

https://stackoverflow.com/questions/10613643/replace-a-unknown-string-between-two-known-strings-with-sed

Sed заменяет 2 строки специальным символом

1 ответ1

2

Чтобы заменить символы между @ и # на my/branch , используйте следующее:

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

Примечание: [^@]* обеспечивает совпадение с ближайшим @ а не с первым.


Поскольку ваши точные потребности неясны, я предполагаю, что вы хотите поменять master с my\branch .

Замены в sed ограничены первым символом после s . Использование символа, которого нет в вашей строке (например !) может быть проще следовать.

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

Кроме того, вы можете избежать косой черты \/ чтобы sed не пытался разграничить ее.

$ sed -e 's/master/my\/branch/' foo.txt
-e git@github.com:acme-inc/repo0.git@my/branch#egg=repo0
-e git@github.com:acme-inc/repo1.git@my/branch#egg=repo1
-e git@github.com:acme-inc/repo2.git@my/branch#egg=repo2

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .