Підставлення першого появи шаблону в рядку для всіх рядків у файлі з sed


16

Чи можливо це зробити в одному вкладиші?

У мене такий результат:

"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, тому я не знаю, чи роблю я щось не так.

Що я тут пропускаю?


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

Відповіді:


34

Ти це переосмислюєш. sedзамінює лише перший екземпляр у рядку за замовчуванням (без /gмодифікатора), хоча ви все-таки хочете прив’язати його, оскільки ви не хочете; t так сильно хочете, щоб перший екземпляр у рядку, як той, що починався з рядка; і зазвичай вам не потрібні чіткі дії лінії, які ви намагаєтеся використовувати (навіщо?).

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.