Arhn - архитектура программирования

Заменить/удалить 2 символа пробелом в однострочнике sed

Милосердные повелители sed, вот мой необработанный вывод:

reboot   system boot  3.10.0-327.28.3. Sun Jan 10 02:16 - 06:52  (04:36)
reboot   system boot  3.10.0-327.28.3. Wed Jan  6 02:00 - 06:52 (4+04:52)
reboot   system boot  3.10.0-327.28.3. Sun Jan  3 00:39 - 06:52 (7+06:13)
reboot   system boot  3.10.0-327.28.3. Sat Jan  2 02:40 - 06:52 (8+04:12)
reboot   system boot  3.10.0-327.28.3. Sat Jan  2 02:39 - 06:52 (8+04:13)
reboot   system boot  3.10.0-327.28.3. Wed Dec 30 06:56 - 06:52 (10+23:56)
reboot   system boot  3.10.0-327.28.3. Wed Dec 30 02:43 - 03:17  (00:34)
reboot   system boot  3.10.0-327.28.3. Wed Dec 30 00:51 - 03:17  (02:26)
reboot   system boot  3.10.0-327.28.3. Tue Dec 29 07:14 - 03:17  (20:02)
reboot   system boot  3.10.0-327.28.3. Tue Dec 29 05:30 - 07:14  (01:44)
reboot   system boot  3.10.0-327.28.3. Tue Dec 29 05:18 - 07:14  (01:55)

Мое желание состоит в том, чтобы удалить скобки в последнем столбце с помощью однострочника sed вместо использования этого неэлегантного и похожего на новичка фрагмента, который почти вопиюще очевиден для использования:

[root@OEL7 ~]# last reboot | sed -e 's/(//g' | sed -e 's/)//g'
reboot   system boot  3.10.0-327.28.3. Sun Jan 10 02:16 - 07:12  04:55
reboot   system boot  3.10.0-327.28.3. Wed Jan  6 02:00 - 07:12 4+05:11
reboot   system boot  3.10.0-327.28.3. Sun Jan  3 00:39 - 07:12 7+06:32
reboot   system boot  3.10.0-327.28.3. Sat Jan  2 02:40 - 07:12 8+04:31
reboot   system boot  3.10.0-327.28.3. Sat Jan  2 02:39 - 07:12 8+04:32
reboot   system boot  3.10.0-327.28.3. Wed Dec 30 06:56 - 07:12 **11+00:15**
reboot   system boot  3.10.0-327.28.3. Wed Dec 30 02:43 - 03:17  00:34
reboot   system boot  3.10.0-327.28.3. Wed Dec 30 00:51 - 03:17  02:26
reboot   system boot  3.10.0-327.28.3. Tue Dec 29 07:14 - 03:17  20:02
reboot   system boot  3.10.0-327.28.3. Tue Dec 29 05:30 - 07:14  01:44
reboot   system boot  3.10.0-327.28.3. Tue Dec 29 05:18 - 07:14  01:55

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

  1. обязательное использование sed
  2. добиться результата кратчайшим путем, без пайпинга и т.д.

Однако, если кто-то из вас знает решение для SO, которое я, возможно, пропустил, я был бы бесконечно благодарен за любые URL-адреса, указатели и т. д.

10.01.2021

Ответы:


1

Вы можете использовать группу захвата, чтобы сопоставить все между круглыми скобками, за которыми следует $, чтобы подтвердить конец строки. Тестирование на Mac, по-видимому, в конце могут быть пробелы.

При замене используйте группу 1.

sed -E 's/\(([^()]+)\)[[:space:]]*$/\1/'

демонстрация регулярных выражений | Sed demo

Без использования -E

sed 's/(\([^()]*\))[[:space:]]*$/\1/'

See another sed demo

10.01.2021
  • Спасибо за столь быстрый ответ, но, похоже, это не работает: [root@OEL7 ~]# last reboot | sed -E 's/\(([^()]+)\)$/\1/' reboot system boot 3.10.0-327.28.3. Sun Jan 10 02:16 - 07:41 (05:24) reboot system boot 3.10.0-327.28.3. Wed Jan 6 02:00 - 07:41 (4+05:40) Примите мою искреннюю благодарность за URL-адреса, я найду им хорошее применение. Большое, большое спасибо еще раз. 10.01.2021
  • @MaximusSuperbus Я обновил ответ, чтобы учесть необязательные пробелы в конце. 10.01.2021

  • 2

    IIUC, вам нужно только:

    last reboot | sed 's,[()],,g'
    
    10.01.2021
  • mirific, это сработало как шарм, и краткость всего этого образцовая! Однако не будете ли вы так любезны объяснить запятые такому смертному, как я? Кажется, я застрял в старой поговорке, что sed разделяет вещи через /, а не ,. 10.01.2021
  • См. stackoverflow.com/a/33914546/3691891. 10.01.2021
  • Отлично, спасибо миллион! 10.01.2021
  • Обратите внимание, что это не только заменяет () в последнем столбце. 10.01.2021
  • @Thefourthbird: конечно, он заменяет все ( и ). Он работает только с last, потому что круглые скобки используются только в последнем столбце. Но это самый простой способ удалить скобки, который, я думаю, искал OP. 10.01.2021
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..