Сделать чередования sed regex следовать слева направо приоритет? - PullRequest
1 голос
/ 31 марта 2019

Я пытаюсь использовать регулярное выражение для форматирования некоторого двоичного файла из xxd -b, но чтобы продемонстрировать это просто, я покажу вам, чего я ожидаю:

Регулярное выражение для удаления: /1x|1.*/

Текст: 1x21y3333333313333 -> 2

Если все вхождения 1x удалены, то все, начиная с первой 1, которая появляется, должно быть удалено.Должно быть сразу очевидно, что происходит, но если это не так, поиграйте с этим .Ключ в том, что если 1x соответствует, остальная часть шаблона должна быть прервана.

Вот вывод из echo "AA" | xxd -b (bindump of AA\n):

0000000: 01000001 01000001 00001010                             AA.

Моя цель: 1. удалить первые 0 для каждого байта (ascii = 7 бит) и 2. удалить оставшуюся часть строки, чтобы сохранить только фактический двоичный файл.Поэтому я передал его в sed 's/ 0//g':

0000000:100000110000010001010                             AA.

Добавляя второй шаг, sed -E 's/ 0| .*//g':

0000000:

Очевидно, я ожидаю вместо этого получить:

0000000:100000110000010001010

Вещи, которые я пробовал, но не выполнил работу:

  • xxd может занять -g0 для объединения столбцов, но он сохраняет первый ноль в каждом байте (символыкаждый занимает байт, а не 7 бит)
  • -r

Тем временем я буду использовать Perl, но такое поведение сбивает меня с толку и, возможно, есть причина (урок)здесь

Ответы [ 3 ]

2 голосов
/ 31 марта 2019

Если я правильно понимаю ваш вопрос, то получится то, что вы хотите:

$ echo "AA" | xxd -b | sed -E 's/ 0|  .*//g'
00000000:100000110000010001010

Ключевым изменением здесь является использование двух пробелов перед .*, так что это соответствует только той части, которую вы хотите удалить.

В качестве альтернативы, мы можем сначала удалить пустой ноль:

$ echo "AA" | xxd -b | sed -E 's/ 0//g; s/ .*//'
00000000:100000110000010001010
1 голос
/ 31 марта 2019

Попробуйте следующее:

 s/ 0| [^0].*//g

Причиной наблюдаемого поведения является то, что POSIX управляет движками, чтобы они следовали стандарту максимально длинное соответствие . Таким образом, если вторая сторона чередования длиннее первой, даже если она вторая по порядку, она совпадает раньше.

0 голосов
/ 22 апреля 2019

попробовал на GNU SED

sed -E 's/\s+(0|[a-z.]+)//ig'
...