有sed替换字符串而SKIP首次出现

时间:2010-01-29 23:32:27

标签: sed

我已经通过了sed one liners,但我的目标仍然存在问题。除了第一次出现一行之外,我想替换匹配的字符串。我的确切用法是:

 $ echo 'cd /Users/joeuser/bump bonding/initial trials' | sed <<MAGIC HAPPENS>
 cd /Users/joeuser/bump\ bonding/initial\ trials

该行将bump bonding中的空格替换为斜杠空格bump\ bonding,以便我可以执行此行(因为当空格未转义时,我将无法cd到它)

更新:我通过使用单引号并输出

解决了这个问题
 cd 'blah blah/thing/another space/'

然后使用source执行命令。但它没有回答我的问题。我仍然很好奇......你会如何使用sed来修复它?

3 个答案:

答案 0 :(得分:11)

您可以使用 g n

来避免此问题

替换所有这些,然后撤消第一个:

sed -e 's/ /\\ /g' -e 's/\\ / /1'

这是使用t branch-if-substituted命令的另一种方法:

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

,其优点是在输入中保留现有的反斜杠空间序列。

答案 1 :(得分:8)

s/ /\\ /2g

2指定应该应用第二个,g指定所有其他应该也适用。 (这可能仅适用于GNU sed。根据Open Group Base Specification,“If both g and n are specified, the results are unspecified.”)

答案 2 :(得分:1)

使用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