![如何使用 sed 将除模式之外的其他字符串替换为其他字符串?](https://linux22.com/image/139204/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20sed%20%E5%B0%86%E9%99%A4%E6%A8%A1%E5%BC%8F%E4%B9%8B%E5%A4%96%E7%9A%84%E5%85%B6%E4%BB%96%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%9B%BF%E6%8D%A2%E4%B8%BA%E5%85%B6%E4%BB%96%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%9F.png)
在将模式与文件中的另一个字符串匹配之前,我需要使用 sed 替换所有内容
我的文件中有各种路径。无论用户如何,这些路径的最后几个组件都是相同的,但是前几个组件将会改变。
对于 例如 对于用户1,该文件包含以下路径
build:
- "/Users/user1/Projects/Stash/sdk/license.txt"
为了用户2,路径可以是
build:
- "/Users/user2/Documents/Work/sdk/license.txt"
最后 2 个组件是“/sdk/license.txt“对于每个用户来说都是一样的。
我想用用户提供的路径替换这些组件之前的所有内容,因为它特定于该用户。如何使用 sed 来执行这种替换?我正在使用 Perl 脚本来实现同样的目的。
答案1
您可以简单地使用反向引用
sed -e 's/\(^[ ]*\- "\)\(.*\)\(\/sdk\/license\.txt"$\)/\1path_with_which_to_be_replaced\3/'
这里
\(....\)
用于分组匹配并保存以备将来使用,替换时使用,可以用作\1
\2
变量名。
所以,根据你的要求,我把线分成三组
\(^[ ]*\- "\)
为了space - "
\(.*\)
对于要更换的零件,例如/Users/user2/Documents/Work
\(\/sdk\/license\.txt"$\)
对于同一部分,即sdk/license.txt"