![Замена первого вхождения шаблона в строку на все строки в файле с помощью sed](https://rvso.com/image/22256/%D0%97%D0%B0%D0%BC%D0%B5%D0%BD%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B2%D0%BE%D0%B3%D0%BE%20%D0%B2%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F%20%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B0%20%D0%B2%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D1%83%20%D0%BD%D0%B0%20%D0%B2%D1%81%D0%B5%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8%20%D0%B2%20%D1%84%D0%B0%D0%B9%D0%BB%D0%B5%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20sed.png)
Можно ли это сделать в одну строку?
У меня получился такой вывод:
"First line" - Description
" Second line" - Description
"Third line" - Description
" Fourth line" - Description
Эти входные данные генерируются автоматически.
Я хочу заменить первое вхождение "
(кавычки + пробел) на "
(кавычки) для каждой строки. Если я применю замену глобально, она также изменит каждое вхождение на line" -
, line"-
поэтому мне было интересно, можно ли использовать однострочник sed для достижения этого.
Я пробовал использовать ^
вот так
sed -r ':a;N;$!ba;s/(\^\" )/\"/g'
Но это не работает, это ничего не заменяет. Я пробовал
sed -r ':a;N;$!ba;s/(^|\" )/\"/g'
и он заменяет все вхождения. Я только начал использовать sed, поэтому не знаю, делаю ли я что-то неправильно.
Что я здесь упускаю?
решение1
Вы слишком много обдумываете. sed
по умолчанию заменяет только первый экземпляр в строке (без модификатора /g
), хотя вы все равно хотите привязаться, потому что вам не так нужен первый экземпляр в строке, как тот, что в начале строки; и вам обычно не нужны явные действия в строке, которые вы пытаетесь использовать (зачем?).
sed 's/^" /"/'
решение2
Более общий ответ, поскольку я не могу прокомментировать ответ geekosaur - Вы бы не поставили ^ (якорь начала строки). Например, если вы хотите заменить первое вхождение A на B, вы бы сделали
sed 's/A/B/'
решение3
С использованиемПерл
~$ perl -pe 's/^" /"/;' file
С использованиемРаку(ранее известный как Perl_6)
~$ raku -pe 's/^\" \s /"/;' file
Пример ввода:
"First line" - Description
" Second line" - Description
"Third line" - Description
" Fourth line" - Description
Пример вывода (оба примера кода):
"First line" - Description
"Second line" - Description
"Third line" - Description
"Fourth line" - Description
https://perldoc.perl.org/perlre
https://perldoc.perl.org/perltrap#Sed-Traps
https://docs.raku.org/language/regexes