Можно ли это сделать в один лайнер?
У меня есть вывод, как это:
"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
regular-expression
Стив Б.
источник
источник
sed
, но для переносимости и во избежание действительно странных ошибок вы должны заканчивать заданный аргумент команды после метки (если они вам вообще нужны). Например,sed -e ':a' -e 'N;$!ba' -e 'whatever'
Ответы:
Вы переосмысливаете это.
sed
по умолчанию заменяет только первый экземпляр в строке (без/g
модификатора), хотя вы все еще хотите привязать его, потому что вы не хотите, чтобы первый экземпляр в строке был так же сильно, как в начале строки; и вам обычно не нужны явные строчные действия, которые вы пытаетесь использовать (почему?).источник
sed
такие команды , какN
и меток , такие как:a
не устарели на всех , и они являются портативными и POSIX указано , в отличии от Perl / Python / Ruby / что угодно. Однако верно, что если вам часто они нужны , вы должны учитьсяawk
.Более общий ответ, так как я не могу комментировать ответ геокозавра - вы не поставите ^ (начало якоря строки). Например, если вы хотите заменить первое вхождение A на B, вы должны иметь
источник