让sed对字符串进行替换,但跳过第一次出现

让sed对字符串进行替换,但跳过第一次出现,sed,Sed,我已经通过了比赛,但是我的目标仍然有问题。我想替换除第一行以外的所有匹配字符串。我的确切用法是: $ echo 'cd /Users/joeuser/bump bonding/initial trials' | sed <<MAGIC HAPPENS> cd /Users/joeuser/bump\ bonding/initial\ trials 然后使用source执行命令。但它没有回答我的问题。不过我还是很好奇。。。您将如何使用sed来修复它 s/ /\\ /2g

我已经通过了比赛,但是我的目标仍然有问题。我想替换除第一行以外的所有匹配字符串。我的确切用法是:

 $ echo 'cd /Users/joeuser/bump bonding/initial trials' | sed <<MAGIC HAPPENS>
 cd /Users/joeuser/bump\ bonding/initial\ trials
然后使用
source
执行命令。但它没有回答我的问题。不过我还是很好奇。。。您将如何使用
sed
来修复它

s/ /\\ /2g
2
指定第二个应用,而
g
指定其他所有应用。(这可能只适用于GNU-sed。根据开放组基本规范,“”)

使用awk

$ echo cd 'blah blah/thing/another space/' | awk '{for(i=2;i<NF;i++) $i=$i"\\"}1'
cd blah\ blah/thing/another\ space/

$ echo 'cd /Users/joeuser/bump bonding/initial trials' | awk '{for(i=2;i<NF;i++) $i=$i"\\"}1'
cd /Users/joeuser/bump\ bonding/initial\ trials

$echo cd'blah blah/thing/other space/'awk'{for(i=2;i您可以避免
g
n的问题

全部更换,然后松开第一个:

sed -e 's/ /\\ /g' -e 's/\\ / /1'
下面是另一种方法,它使用
t
分支if-replacement命令:

sed ':a;s/\([^ ]* .*[^\\]\) \(.*\)/\1\\ \2/;ta'

它的优点是保留输入中现有的反斜杠空格序列完好无损。

您对GNU-sed的看法是正确的。在我的Mac上它不起作用。但这正是我所寻找的优雅解决方案。@physicsmichael您可以使用
brew install gsed
在Mac上安装GNU-sed。安装后,您可以键入coM和作为
/usr/local/bin/gsed
而不是
sed
。您的第一个答案看起来是通用解决方案。稍微阅读一下,-e标志似乎就是我真正想要的。1和\\的解释?
sed ':a;s/\([^ ]* .*[^\\]\) \(.*\)/\1\\ \2/;ta'