执行sed命令时执行错误

问题描述 投票:0回答:1

下面给出的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'
linux bash sed matching text-parsing
1个回答
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的说法,至少在某个时间点确实如此。)

© www.soinside.com 2019 - 2024. All rights reserved.