2010-01-29 8 views
9

Я прошел через sed one liners, но у меня все еще есть проблемы с моей целью. Я хочу подставить соответствующие строки для всех, кроме первого вхождения строки. Мое точное использование было бы:Имейте sed заменить на строку, но SKIP первое появление

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

линия заменила пространство в bump bonding с косой чертой пространства bump\ bonding, так что я могу выполнить эту строку (так как, когда пространства не спасся, я не смог бы кд в Это).

Update: Я решил эту проблему, используя только одиночные кавычки и вывода

cd 'blah blah/thing/another space/' 

, а затем с помощью source, чтобы выполнить команду. Но он не ответил на мой вопрос. Мне все еще интересно, но ... как бы вы использовали sed, чтобы исправить это?

ответ

9

Вы можете избежать проблемы с g и п

Заменить все из них, затем отменить первый:

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

Вот еще один метод, который использует t ветви, если замещенное команду:

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

, который имеет то преимущество, оставляя существующие обратное косую черту-пространство последовательностей в входе нетронутыми.

+0

Ваш первый ответ выглядит универсальным решением. С небольшим чтением флаг -e кажется тем, что я действительно искал. – physicsmichael

8
s/ /\\ /2g 

2 указывает, что второй следует применять, и g указывает, что все остальные должны применяться также. (Это возможно, работает только на GNU SED. В соответствии с базовой спецификации Open Group, "If both g and n are specified, the results are unspecified.")

+0

Вы правы относительно GNU sed. На моем Mac это не работает. Но это точный вид элегантного решения, которое я искал. – physicsmichael

+1

@physicsmichael Вы можете установить GNU sed на Mac с помощью 'brew install gsed'. После установки вы можете ввести команду '/ usr/local/bin/gsed' вместо' sed'. – stacko

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 

 Смежные вопросы

  • Нет связанных вопросов^_^