sed命令在solaris中工作,但在Linux中不工作

问题描述:

我是shell脚本和sed命令的新手。sed命令在solaris中工作,但在Linux中不工作

以下sed命令工作在Solaris中,但在Linux中给错误:

sed -n 's/^[a-zA-z0-9][a-zA-z0-9]*[ ][ ]*\([0-9][0-9]*\).*[/]dir1[/]subdir1\).*/\2:\1/p' 

的错误是

sed: -e expression #1, char 79: Invalid range end 

我不知道为什么它给无效范围终点误差。

+2

字符范围'A-z'包含**所有**字符,其中ASCII值介于'A'和'z'之间。这包括上下级的alpha,以及'''''''',''''''','^','_'和反引号。这可能不是故意的,是吗? –

+0

@拉马先生是的,这不是故意的。它现在正在工作,一旦我改变Az到AZ – Hello

+0

'[a-zA-z0-9]'相当于'[[:alnum:]]'(是的,带有双括号) –

看起来像Linux Sed不喜欢你的A-z(两次)。无论如何,这并没有什么意义。

使用[A-Z](大写Z)

+0

谢谢..它正在处理大写字母Z.看起来solaris的解释与Linux不同 – Hello

正如blue112说,A-z为一个范围是没有意义的。 Solaris sed将其解释为“通过z的ASCII代码为A的ASCII码”,在这种情况下,您可能会发生意外的匹配。 A-Z出现在ASCII码a-z之前,但有几个字符落在Za之间。

59 Y 
5a Z 
---- 
5b [ 
5c \ 
5d ] 
5e^
5f _ 
60 ` 
---- 
61 a 
62 b 

以下是显示Solaris sed(本例中为Solaris 8)的示例。考虑到这个范围,它会替代_\以及您明显定位的字母。

% echo "f3oo_Ba\\r" | /usr/bin/sed 's/[A-z]/./g';echo 
.3..... 

(注意3不会被替换,因为它不属于指定的ASCII范围。)

GNU sed的是保护你从错误搬起石头砸自己的脚。