以下给定的sed命令在联机BASH和KSH Shell上运行良好,但是在尝试在Linux服务器上运行时出现错误“非法操作--r”。
我正试图制作一个正则表达式来从第一行解析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'
答案 0 :(得分:1)
使用sed -r
(或某些方言sed -E
)是非标准和可选的。
它选择一种称为扩展正则表达式的正则表达式,使您可以更简洁地表达一些东西。
POSIX基本正则表达式支持几乎相同的功能,但是使用奇数球语法,您必须对某些字符进行反斜杠以获取其特殊含义(换句话说,它与反斜杠转义的功能完全相反)。
因此,如果您有一个扩展的正则表达式,例如a+(b{2})c
,那么如果您的sed
不支持-r
或-E
,请尝试a\+\(b\{2\}\}c
,不要使用任何特殊选项,并希望您的sed
至少与POSIX指定的水平相当。 (但是,如果您对逆向计算很认真,则不太可能。)
Ken Thompson最初的正则表达式实现仅支持正则表达式元字符[...]
和.
和*
,而且很长一段时间内,这也支持sed
当然,您总是可以安装更现代的sed
。我知道SunOS的xpg4
目录中曾经有一些好东西,但是我不知道Solaris是否是这种情况。如果是这样,也许您只需要将/usr/xpg4/bin
添加到您的PATH
中。 (根据this,至少在某个时间点是这样。)