我有一个名为Gemfile的文件。这个文件中的一行是:
gem 'my-platform', git: 'git@github.com:me/platform-engine.git'
我想用这个替换它:
gem 'my-platform', git: 'git@github.com:me/platform-engine.git', branch:'issue-2'
为此,我使用了这个命令:
sed -i s#platform-engine.git\'#platform-engine.git\', branch:\'issue-2\'#g Gemfile
但是我收到了这个错误:
sed:-e表达式#1,字符44:未终止的`s'命令
我做错了什么?我该如何解决?
答案 0 :(得分:2)
在我看来,你只想在行尾添加一些文字。如果是这样,请使用$
引用行尾并执行此替换:
sed -i.bak "/platform-engine.git/s/$/, branch:'issue-2'/" Gemfile
这会将给定文本添加到包含platform-engine.git
的行的末尾。请注意,不需要使用/g
,因为您只想每行更换一次。
另请注意,创建备份文件是一种很好的做法,以防万一!
如果您需要使用任何含义的单引号,请使用此转义策略:
sed 's/'\''//'
^^^^
just to match as single quote!
测试:
$ echo "he'llo" | sed 's/'\''//'
hello
否则你会得到你提到的错误:" sed:-e expression#1,char 44:unterminated s'命令"
答案 1 :(得分:1)
如果将模式放在双引号内,则无需转义'
。
sed "s~platform-engine.git'~platform-engine.git', branch:'issue-2'~g" file
OR
$ sed "s~platform-engine.git'~&, branch:'issue-2'~g" file
gem 'my-platform', git: 'git@github.com:me/platform-engine.git', branch:'issue-2'
&
指的是匹配的字符。