我已经通过了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
来修复它?
答案 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