在中requirements.txt
,我想替换可能包含正斜杠、破折号和其他可能需要转义的特殊字符的分支/提交:
-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
一个示例目标是用任意分支或提交替换 @ 和 # 之间的内容。例如:
-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
这不会产生所需目标的第 0 行:
sed -i 's/(repo0.git@).*(#)/"my/branch/0"/' testfile.txt
有关的:
答案1
@
要将和#
之间的字符替换为my/branch
,请使用以下命令:
$ 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
注意:[^@]*
确保您匹配最近的@
而不是第一个。
由于您的确切需求不清楚,我假设您想要master
与之交换my\branch
。
中的替换sed
由 之后的第一个字符分隔s
。使用字符串中未出现的字符(例如!
)可能更容易理解。
$ 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
或者,您可以转义正斜杠,\/
这样sed
就不会尝试对其进行分隔。
$ 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