Приведенная ниже команда 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'
Я все еще получаю сообщение об ошибке: sed: недопустимая опция -- E sed: недопустимая опция -- E -bash-4.1$
Если вы правильно расшифровали сообщение об ошибке, проблема в том, что у вас есть два тире перед -r. Linux в целом поддерживает sed -r, но «Linux» — это очень широкое понятие — какой дистрибутив и версия, какая sed версия? (Попробуйте uname -a, lsb_release -a, sed --version)
В конечном счете, защитным обходным путем будет перефразировать регулярное выражение как BRE: sed -n 's/.*{1:F01\([A-Z]\{12\}\).*/\1/p' или, может быть, даже произнести «[A-Z]» двенадцать раз.
Вы только что спасли меня. Я был бы очень благодарен, если бы вы могли объяснить мне, почему вы изменили \. Также логика, стоящая за этим, поскольку я новичок в sed и regex? Почему вы поместили '\' перед '(' и '{' не с каждым специальным символом. И если есть такие символы, как '+', '.' и ',' как показано в данных примерах, когда я получаю sed: команда искажена», пример 1): sed -rn 's/.*\{2\:O([0-9]+)([AZ]+).*/\1/p' для анализа BKKBTHBKBXXX из {2: O3051540181108CIBBMYKLAXXX40470066801811081540N}
Также этот пример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(в одну строку)
Ты на Солярисе?
@WiktorStribiżew Да. -bash-4.1$ uname -a SunOS stqusmrxapp01 5.11 11.3 i86pc i386 i86pc
@tripleee Спасибо, вы только что спасли меня. Я был бы очень благодарен, если бы вы могли объяснить мне, почему вы изменили \. Также логика, стоящая за этим, поскольку я новичок в sed и regex? Почему вы поместили '\' перед '(' и '{' не с каждым специальным символом. И если есть такие символы, как '+', '.' и ',' как показано в данных примерах, когда я получаю sed: команда искажена», пример 1): sed -rn 's/.*\{2\:O([0-9]+)([AZ]+).*/\1/p' для анализа BKKBTHBKBXXX из {2: O3051540181108CIBBMYKLAXXX40470066801811081540N}
Если вы работаете в Solaris, то по определению вы не в Linux.





Использование 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. (Согласно это, это было правдой по крайней мере в какой-то момент времени.)
«Полезности» в данном случае неверны; собственно говоря, был способ сделать его чуть менее отстойным.
Попробуйте заменить
rнаE,sed -En 's/.*\{1:F01([A-Z]{12}).*/\1/p'