Почему эта замена регулярных выражений не работает?

У меня есть файл в следующем формате:

$ cat myfile 12 42956 Cinema - 3D/Multiplex 7 12560 Status Update 5 184 Movie 

Я пытаюсь добавить двойные кавычки к текстовому описанию.
Я не могу понять, почему следующее регулярное выражение не работает:
$ sed -E 's/\b[0-9]+\b\s*\b[0-9]+\b\s*([^\s]+)/"\1"/g' myfile

Мой вопрос касается конкретно этого регулярного выражения, а не другого подхода к тому, чтобы делать то же самое. я

  • Как удалить строки, содержащие IP-адрес?
  • Добавить слова в список слов с помощью sort -u avoinding duplicata
  • Как удалить символы из столбца с помощью awk
  • Как удалить строки, содержащие некоторые имена в одном столбце в файлах txt
  • Как проверить, отсутствует ли какой-либо повторяющийся текст в текстовом файле?
  • Переименуйте имена файлов MP3 в шаблон
  • Найти, если какая-либо строка файла является подмножеством данных в другом файле
  • Как grep для текста в файле и отображать абзац с текстом?
  • 3 Solutions collect form web for “Почему эта замена регулярных выражений не работает?”

    Насколько я знаю, \s является регулярным выражением Perl, которое совпадает с [[:blank:]] в sed . Внутри [ ... ] , \s означает «an \ и s ». Также обратите внимание, что даже если [^\s]+ было бы таким же, как [^␣]+ , это не соответствовало бы Status Update из-за пространства в середине.

    Замена заменит все совпадения первой группой в двойных кавычках. Вероятно, вы хотите поймать все три столбца, иначе вы получите только последний столбец. И поскольку вы пытаетесь сопоставить всю строку, вы должны привязать выражение в начале и конце с помощью ^ и $ и сбросить флаг g в конце.

    Альтернатива:

     $ sed -E 's/[[:alpha:]].+/"&"/' myfile 12 42956 "Cinema - 3D/Multiplex " 7 12560 "Status Update " 5 184 "Movie " 

    Это найдет последний столбец из-за того, что его данные всегда начинаются с цифры. Выражение просто будет соответствовать остальной части строки из первого алфавитного символа и заменить все совпадения на версию с двойными кавычками.

    Данные в вопросе имели пробелы в конце, и эти цитаты будут включать эти. Чтобы избежать пробелов в конце:

     $ sed -E -e 's/[[:blank:]]*$//' -e 's/[[:alpha:]].+/"&"/' myfile 12 42956 "Cinema - 3D/Multiplex" 7 12560 "Status Update" 5 184 "Movie" 

    С другой стороны,

     while read -rabc; do printf '%d\t%d\t"%s"\n' "$a" "$b" "$c"; done <myfile 12 42956 "Cinema - 3D/Multiplex" 7 12560 "Status Update" 5 184 "Movie" 
     sed -E 's/\b([0-9]+\b\s*\b[0-9]+)\b\s*([^\s]+)/\1 "\2"/g' myfile 

    Это добавляет двойные кавычки вокруг вашего текста.

    Сохраняя цифры и пробелы в группе \1 и строку в другой группе (\ 2), sed выводит группу 1 (\ 1), а затем пробел, за которым следует двойная кавычка, за которой следует вторая группа (\ 2), за которой следует окончательная двойная кавычка.

    Вы можете сократить это немного, объединив все цифры и пробелы в одной группе ([0-9, ]*) и все, что после цифр в другой группе (.+) .

    Это дает:

     sed -E 's/([0-9, ]*)(.+)/\1 "\2"/g' myfile 12 42956 "Cinema - 3D/Multiplex" 7 12560 "Status Update" 5 184 "Movie" 

    Поскольку Mac OSX sed не поддерживает \s . Только GNU sed поддерживает \s .

    В Mac OSX \s не работает, даже при цитировании $'' ANSI-C.

     $ echo $'1\t2 3' | sed 's/\s//g' 1 2 3 $ echo $'1\t2 3' | sed $'s/\s//g' 1 2 3 

    Вместо этого вы можете использовать [[:space:]]

     $ echo $'1\t2 3' | sed 's/[[:space:]]//g' 123 

    Или вы можете использовать [ \t] , но вам понадобится котировка $'' ANSI-C для символа табуляции.

     $ echo $'1\t2 3' | sed $'s/[ \t]//g' 123 
    Interesting Posts

    Почему драйвер 8250 UART не разбудил TTY, если еще не принято 256 символов?

    Установка Linux застряла в запуске из-за графических карт nvidia

    Виртуальные хосты CentOS Apache – доступная структура типов

    Будут ли снимки btrfs когда-либо передавать кеш страниц?

    В HP-UX, как я могу записывать сообщения системных событий Information Only Only в syslog.log?

    Захват драйверов ОС / аппаратных средств связи / обратного проектирования

    Создать и открыть файл с помощью одной команды?

    Список явно удаленных пакетов (apt)

    Генерация динамического содержимого файла: Удовлетворение файла «открытым» путем «выполнения процесса»

    И «stat -f» и «cat / etc / fstab» показывают идентификаторы файловой системы?

    grep с сортировкой по столбцу

    Как использовать необязательный аргумент?

    Невозможно использовать yast для установки программного обеспечения онлайн – пытается установить компакт-диск

    Программа для создания полного ISO-образа поврежденного DVD несколькими показаниями?

    Переход на виртуальный терминал медленный

    Linux и Unix - лучшая ОС в мире.