Ошибка выполнения при выполнении команды sed

Приведенная ниже команда sed отлично работает в онлайн-оболочке BASH и KSH, но получает сообщение об ошибке «Недопустимая операция --r» при попытке запустить ее на сервере Linux.

Я пытаюсь сделать регулярное выражение для анализа MFBBMYKLAXXX из первой строки.

echo "{1:F01MFBBMYKLAXXX2474811384}{2:O3001434181108BKKBTHBKBXXX12203020241811081534N}{3:{108:241C182AFFD4403C}}{4:
:15A:
:20:10168957
:22A:NEWT
:94A:BILA
:22C:BKKBBK8308MFBBKL
:82A:BKKBTHBK
:87A:MFBBMYKL
:15B:
:30T:20181108
:30V:20181109
:36:32,8308
:32B:THB2500000,
:53A:/610165
BKKBTHBK
:57A:BKKBTHBK
:33B:USD76148,01
:53A:CHASUS33
:57A:/04058664
BKTRUS33
:58A:MFBBMYKL
:15C:
:24D:ELEC/REUTERS D-3000
-}{5:{CHK:4117CD0206B7}}{S:{COP:S}}
" | sed -rn 's/.*\{1:F01([A-Z]{12}).*/\1/p'

Попробуйте заменить r на E, sed -En 's/.*\{1:F01([A-Z]{12}).*/\1/p'

Wiktor Stribiżew 28.02.2019 16:05

Я все еще получаю сообщение об ошибке: sed: недопустимая опция -- E sed: недопустимая опция -- E -bash-4.1$

Noobie 01.03.2019 06:20

Если вы правильно расшифровали сообщение об ошибке, проблема в том, что у вас есть два тире перед -r. Linux в целом поддерживает sed -r, но «Linux» — это очень широкое понятие — какой дистрибутив и версия, какая sed версия? (Попробуйте uname -a, lsb_release -a, sed --version)

tripleee 01.03.2019 06:51

В конечном счете, защитным обходным путем будет перефразировать регулярное выражение как BRE: sed -n 's/.*{1:F01\([A-Z]\{12\}\).*/\1/p' или, может быть, даже произнести «[A-Z]» двенадцать раз.

tripleee 01.03.2019 06:54

Вы только что спасли меня. Я был бы очень благодарен, если бы вы могли объяснить мне, почему вы изменили \. Также логика, стоящая за этим, поскольку я новичок в sed и regex? Почему вы поместили '\' перед '(' и '{' не с каждым специальным символом. И если есть такие символы, как '+', '.' и ',' как показано в данных примерах, когда я получаю sed: команда искажена», пример 1): sed -rn 's/.*\{2\:O([0-9]+)([AZ]+).*/\1/p' для анализа BKKBTHBKBXXX из {2: O3051540181108CIBBMYKLAXXX40470066801811081540N}

Noobie 01.03.2019 08:44

Также этот пример2) sed -rn 's/.*1600([AZ ]{17})([AZ ]{17})([A-Z0-9]{5})([0-9,.]{ 12})([0-9]{8})([A-Z0-9]{16}).*/\‌​6/p' <<< 'sed -sn 2p' для анализа M999517511051514 из 1600MFBBMYKL ALSRMYKL IFT0000769771622820181105M999517511051514(в одну строку)

Noobie 01.03.2019 08:44

Ты на Солярисе?

Wiktor Stribiżew 01.03.2019 09:42

@WiktorStribiżew Да. -bash-4.1$ uname -a SunOS stqusmrxapp01 5.11 11.3 i86pc i386 i86pc

Noobie 01.03.2019 09:45

@tripleee Спасибо, вы только что спасли меня. Я был бы очень благодарен, если бы вы могли объяснить мне, почему вы изменили \. Также логика, стоящая за этим, поскольку я новичок в sed и regex? Почему вы поместили '\' перед '(' и '{' не с каждым специальным символом. И если есть такие символы, как '+', '.' и ',' как показано в данных примерах, когда я получаю sed: команда искажена», пример 1): sed -rn 's/.*\{2\:O([0-9]+)([AZ]+).*/\1/p' для анализа BKKBTHBKBXXX из {2: O3051540181108CIBBMYKLAXXX40470066801811081540N}

Noobie 01.03.2019 09:50

Если вы работаете в Solaris, то по определению вы не в Linux.

tripleee 20.02.2021 11:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
87
1

Ответы 1

Использование sed -r (или в некоторых диалектах sed -E) нестандартно и необязательно.

Он выбирает диалект регулярных выражений, называемый расширенными регулярными выражениями, который позволяет вам выражать некоторые вещи более кратко.

Базовые регулярные выражения POSIX поддерживают почти те же возможности, но с необычным синтаксисом, когда вам нужно использовать обратную косую черту для некоторых символов, чтобы получить их особое значение (что, другими словами, делает прямо противоположное тому, что первоначально делало экранирование обратной косой черты).

Итак, если у вас есть расширенное регулярное выражение, такое как a+(b{2})c, то, если ваше sed не поддерживает ни -r, ни -E, попробуйте a\+\(b\{2\}\}c без каких-либо специальных параметров и надейтесь, что ваше sed хотя бы примерно соответствует тому, что указывает POSIX. (Если вы серьезно относитесь к ретрокомпьютерам, это маловероятно.)

Первоначальная реализация регулярных выражений Кена Томпсона поддерживала только метасимволы регулярных выражений [...], . и *, и в течение долгого времени поддерживались только sed.

Конечно, всегда можно было установить более современный sed. Я знаю, что у SunOS в каталоге xpg4 были какие-то вкусности, но я понятия не имею, было ли это так в Solaris; если это так, возможно, вам просто нужно добавить /usr/xpg4/bin к вашему PATH. (Согласно это, это было правдой по крайней мере в какой-то момент времени.)

«Полезности» в данном случае неверны; собственно говоря, был способ сделать его чуть менее отстойным.

tripleee 01.03.2019 10:09

Другие вопросы по теме