如何替换文件中两个唯一字符串之间的文本?

如何替换文件中两个唯一字符串之间的文本?

在中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

有关的:

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 在两个字符串之间用特殊字符进行替换

答案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

相关内容