Замените sed на строку, но ПРОПУСТИТЕ первое вхождение

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

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

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

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

 cd 'blah blah/thing/another space/'

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


sed
person physicsmichael    schedule 29.01.2010    source источник


Ответы (3)


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

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

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

Вот еще один метод, использующий команду t branch-if-subplaced:

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

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

person Dennis Williamson    schedule 30.01.2010
comment
Ваш первый ответ выглядит универсальным решением. После небольшого чтения флаг -e кажется тем, что я действительно искал. - person physicsmichael; 31.01.2010

s/ /\\ /2g

2 указывает, что должен применяться второй, а g указывает, что все остальные тоже должны применяться. (Вероятно, это работает только в GNU sed. Согласно базовой спецификации Open Group, « указаны оба g и n, результаты не указаны.")

person Chris Jester-Young    schedule 30.01.2010
comment
Вы правы насчет GNU sed. На моем Mac это не работает. Но это именно то элегантное решение, которое я искал. - person physicsmichael; 30.01.2010
comment
@physicsmichael Вы можете установить GNU sed на Mac с помощью brew install gsed. После установки вы можете ввести команду как /usr/local/bin/gsed вместо sed. - person stacko; 30.12.2016

использовать 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
person ghostdog74    schedule 30.01.2010
comment
объяснение 1 и \\ ? - person CodeFarmer; 24.01.2019