Об'єднати дві окремі sed-вирази в одну?


0

Я читаю RealNameз dsclрізних користувачів. Залежно від користувача, вихід може бути одним з наступних:

RealName: <name>

Або:

RealName:
 <name>

Таким чином я повинен sed -e 's|^[RealName:[:space:]]*||g' -e '/^$/d'отримати тільки <name>у будь-якому випадку. Я новачок у регулярних виразах, тому мені не вистачає об'єднання двох виразів. Будь-які пропозиції? (Просто робимо це для задоволення. Ця команда працює просто відмінно.)

Відповіді:


1
  1. Підібрати рядок, який має тільки RealName: і пробіли, додайте наступний рядок до простору шаблону.
  2. видалити RealName: і новий рядок.
  3. Що залишилося, має бути <name>

Після того, як порядок команд має значення, наступна команда select-lines, що відповідає будь-якому ( (.*)) на рядку, що починається з RealName: буде мати "щось цікаве" після відповідного регулярного виразу.

  1. Підберіть всі інші рядки, що починаються з RealName: і зробіть те ж саме без нових рядків
  2. видалити порожні рядки.

sed -E -e '
  /^RealName:\s*$/{ N; s/RealName:.*\n//  }; 
  /^RealName:(.*)/{ s//\1/  };
  /^$/d
' ~/tmp/RealName

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

/hello world/{ s//bye mars/ }    
<=>
/hello world/{ s/hello world/bye mars/ }

Хіба це не стосується декількох виразів замість двох? Чи є це більш-менш ефективним?
2rs2ts

1
Якщо за виразом ви маєте на увазі аргументи до опції -e, то ця відповідь об'єднує два окремі вирази в одну з трьома командами. Для Realname я використав два окремих вирази: <foo> vs Realname: n <foo>, тому що простіше продемонструвати, записати і запам'ятати. І що важливо, напевно, додавання рядка _N_ext є "повільним". Але ^ RealName s * $ має бути менш дорогим, ніж [: NRaelm] *. Тому загалом вона повинна бути швидше.
Ярослав Рахматуллин

Зрозумів. Дякуємо за те, що це робиться. Я припускаю, що я мав на увазі крапку з комою, розділені частиною виразу, а не кілька -eваріантів. Це більш детально, але якщо це ефективніше, це чудово.
2rs2ts

1
sed дуже швидко в цілому. Вам не потрібно турбуватися про ефективність, якщо ваш вхід дуже великий (гігабайт).
Ярослав Рахматуллин

1

Це не набагато коротше, але ви можете просто зробити це

sed -e 's|^[RealName:[:space:]]*||g;/^$/d'

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


Дякуємо за посилання. Не можу зробити його голови або хвости, хоча; Я тільки починаю з регулярного виразу і, на жаль, команда, написана автором, занадто складна для мене.
2rs2ts
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.