Sed замінюють через речення в декількох рядках


11

Я новачок в застосуванні sed, але я експериментував sed s/..../..../(замінити), щоб змінити повне речення, якщо воно знаходиться в одному рядку, але я не знаю альтернативного рішення щодо зміни речення, яке, можливо, було розділено на два рядки, такі як:

Це:

Lorem Ipsum is simply dummy text of the printing and typesetting industry.

насправді написано так:

Lorem Ipsum is simply dummy text of the 
printing and typesetting industry.

Як ви можете виявити це або кодувати його, щоб замінити все речення, навіть якщо воно є в двох рядках замість одного?


Чудовий довідник по sed: Посібник з уроку та довідки про Сена Даніеля А. Голдмана ISBN: 978-1-939824-01-1 (версія EPUB) 08148804441822
Joe,

Відповіді:


16

Наступна команда працюватиме в обох ситуаціях:

sed '/Lorem.*/ {N; s/Lorem.*industry\./string to replace/g}' filename

Більше пояснень: Як можна використовувати sed для заміни багаторядкового рядка?


3
@Gilles Я розумію ваші добрі наміри, але будь ласка, спробуйте перевірити, перш ніж зіпсувати мою відповідь. Краще, якщо у вас є інша думка, - додати ще одну відповідь або залишити коментар.
Radu Rădeanu

Ласкаво просимо до обміну стеками. Цей веб-сайт редагується спільно. Якщо вам не подобається думка про те, що ваші внески редагуються спільно від інших довірених користувачів, це може бути не сайтом для вас. Я помітив, що ваш код замінив більше, ніж конкретна фраза, яка була призначена, і я відредагував фразу.
Жил "SO- перестань бути злим"

@Gilles Будь ласка, вам не потрібно бути пустотливим. Ви також повинні помітити, що ваш "код" замінив абсолютно нічого . Як я вже сказав, я розумію ваші добрі наміри. З мого прикладу я припускаю, що ОП розуміє, як замінити речення на кілька рядків на sed, не більше того. І це заголовне питання. Заголовок не про perl.
Radu Rădeanu

Ні, код, який я розмістив, працює. (За винятком випадків, коли він Loremзнаходиться на останньому рядку, дефект, яким він ділиться з вашою версією.)
Жил "SO- перестаньте бути злим"

Цей приклад не працює, коли є 3 або більше рядків тексту :(
artnikpro

12

Хоча sed може відповідати шаблонам у декількох рядках (за допомогою команд Nабо Hдодавати послідовні рядки перед узгодженням), це далеко за межами зони комфорту. Намагайтеся, лише якщо вам подобається біль.

Perl може робити такі речі чудово. Використовуйте -pперемикач, щоб змусити його обробляти стандартне введення по одному запису за раз і надрукувати модифіковану запис (à la sed) та -000ввімкнути режим абзацу (де записи розділені порожніми рядками). У регулярному виразі \sвідповідає будь-якому символу пробілу, включаючи новий рядок.

perl -p -000 -e 's/Lorem\s+Ipsum\s+is\s+simply\s+dummy\s+text\s+of\s+the\s+printing\s+and\s+typesetting\s+industry\./Replacement text/g'

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


@terdon Ах, я мав намір дозволити кілька пробілів, але забув. Спасибі, виправлено.
Жил "ТАК - перестань бути злим"

Питання про те sed. Це також позначено sed, а не з perl.
Radu Rădeanu

0

sed не може легко читати через кілька рядків. Використовуйте perl -i -0pe 's/.../.../...'замість цього.


7
sed може читати через кілька рядків!
Radu Rădeanu

3
@ RaduRădeanu Технічно, так. Але рідко варто турбуватися.
Жил "ТАК - перестань бути злим"

3
@Gilles Якщо використання perlдля вас більш просте, це не означає, що sedрідко варто турбуватися.
Radu Rădeanu
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.