让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'