执行sed命令时执行错误

时间:2019-02-28 15:02:31

标签: linux bash sed matching text-parsing

以下给定的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'

1 个答案:

答案 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,至少在某个时间点是这样。)

相关问题