Подстановка первого вхождения шаблона в строке для всех строк в файле с помощью sed


16

Можно ли это сделать в один лайнер?

У меня есть вывод, как это:

"First line" - Description  
" Second line" - Description  
"Third line" - Description  
" Fourth line" - Description  

Этот вход генерируется автоматически.

Я хочу заменить первое вхождение "(кавычка + пробел) на "(кавычка) для каждой строки. Если я применяю подстановку глобально, она также будет меняться при каждом появлении line" -на line"-, поэтому мне было интересно, можно ли использовать sed one liner для достижения этой цели.

Я пытался использовать ^как это

sed -r ':a;N;$!ba;s/(\^\" )/\"/g'

Но это не работает, это ничего не заменяет. Я попытался

sed -r ':a;N;$!ba;s/(^|\" )/\"/g'

и он заменяет все вхождения. Я только начал использовать sed, поэтому я не знаю, правильно ли я что-то делаю.

Что мне здесь не хватает?


Примечание о метках: команда, которую вы написали выше, может работать в некоторых реализациях sed, но для переносимости и во избежание действительно странных ошибок вы должны заканчивать заданный аргумент команды после метки (если они вам вообще нужны). Например,sed -e ':a' -e 'N;$!ba' -e 'whatever'
Wildcard

Ответы:


34

Вы переосмысливаете это. sedпо умолчанию заменяет только первый экземпляр в строке (без /gмодификатора), хотя вы все еще хотите привязать его, потому что вы не хотите, чтобы первый экземпляр в строке был так же сильно, как в начале строки; и вам обычно не нужны явные строчные действия, которые вы пытаетесь использовать (почему?).

sed 's/^" /"/'

Спасибо! Я подумал, что необходимо явно объявить действия строки при работе с файлом, прочитать об этом и просто продолжать их использовать. Я действительно думал об этом, это не может быть проще, и это делает свое дело :)
Стив Б.

Я испытываю желание сказать, что эти команды в значительной степени устарели; с ними можно делать довольно сложные многострочные вещи, но это нелегко сделать, и в наши дни вам действительно лучше использовать perl / python / ruby ​​/ что угодно вместо этого.
geekosaur

Полностью не согласен с приведенным выше комментарием; многострочные sedтакие команды , как Nи меток , такие как :aне устарели на всех , и они являются портативными и POSIX указано , в отличии от Perl / Python / Ruby / что угодно. Однако верно, что если вам часто они нужны , вы должны учитьсяawk .
Wildcard

2

Более общий ответ, так как я не могу комментировать ответ геокозавра - вы не поставите ^ (начало якоря строки). Например, если вы хотите заменить первое вхождение A на B, вы должны иметь

sed 's/A/B/'
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.