Regex 在Solaris 10和11上,对sed输出进行排序会得到不同的结果

Regex 在Solaris 10和11上,对sed输出进行排序会得到不同的结果,regex,sed,solaris,Regex,Sed,Solaris,我有一个命令,可以从文件名中提取日期并计算唯一的天数: find xml/-type f-name“*.201604*.xml”| head-5 | sed“s/*.\(2016[0-9]\{4\}\)\(.*)/\1/g“| sort | uniq-c Solaris 10上的结果如下: # find xml/ -type f -name "*.201604*.xml" | head -5 | sed "s/.*\.\(2016[0-9]\{4\}\)\(.*\)/\1/g" | sort |

我有一个命令,可以从文件名中提取日期并计算唯一的天数:

find xml/-type f-name“*.201604*.xml”| head-5 | sed“s/*.\(2016[0-9]\{4\}\)\(.*)/\1/g“| sort | uniq-c

Solaris 10上的结果如下:

# find xml/ -type f -name "*.201604*.xml" | head -5 | sed "s/.*\.\(2016[0-9]\{4\}\)\(.*\)/\1/g" | sort | uniq -c
   2 20160412
   1 20160417
   2 20160418
# uname -a
SunOS localhost 5.10 Generic_150400-26 sun4u sparc SUNW,SPARC-Enterprise
# which sed sort
/usr/bin/sed
/usr/bin/sort
Solaris 11上的结果如下:

$ find xml/ -type f -name "*.201604*.xml" | head -5 | sed "s/.*\.\(2016[0-9]\{4\}\)\(.*\)/\1/g" | sort | uniq -c
   1 20160401
   1 20160403
   1 20160405
   1 xml/results/subres/ABC.DEF.GH01.20160401224003.123456.123456.xml
   1 xml/results/subres/ABC.DEF.GH02.20160412124035.234567.234567.xml
$ uname -a
SunOS localhost 5.11 11.2 sun4v sparc sun4v
$ which sed sort
/usr/bin/sed
/usr/bin/sort
出于某种原因,在Solaris 11上,
sort
命令会导致
sed
返回完整的文件路径,而不是匹配的正则表达式

但它不需要排序即可工作(Solaris 11):


为什么??其他人有这种行为吗?

find
给出未排序的结果。在使用
head-5
之前,对
find
的输出进行排序

另外,
set LC_ALL=C

您在调用
sed
后调用
sort
,因此
sort
不会影响
sed
的行为。您只是在每台机器上拾取不同版本的sed,可能一个来自/bin,它不理解转义的ERE字符以创建re间隔(
\{4\}
),另一个来自/usr/xpg4/bin或类似的代码

如果没有某些环境更改,您会说Solaris 11在有/无排序的情况下表现不同——可能您在不同的shell中,或者运行了不同的安装脚本或其他东西


在两台机器上执行
where sed
(或
哪个sed
从哪里sed
或…)

通过执行
取消设置LANG
解决问题。它被设置为
en_US.UTF-8
man
表示
LANG
影响
sed
命令执行。

如果用一个简单的
cat
替换
sort | uniq-c
,在Solaris 11上会得到什么输出?@AndrewHenle与
sort
的结果相同,它会显示两个文件名而不是regex结果,看起来您在Solaris 10服务器上有一个根提示符,这意味着您可能正在运行Solaris
sh
——与Linux不同,Solaris没有将
sh
bash
@AndrewHenle合并,不,
sed
没有别名。此外,根提示符是假的,它由PS1=“#”设置
echo$SHELL
给了我
/usr/bin/bash
。请注意,在代码示例中,我已经做了
哪个sed排序
。路径相同。此外,如果在
sed
之后没有
sort
,结果是正确的,因此它看起来像
sort
,或者
cat
会影响
sed
。奇怪,因为这些是管道。而且,五个输出行中只有两个不是正则表达式匹配结果。所以,它匹配前三个,而不匹配第二个。啊,如果你向我们展示sed的输入,而不仅仅是输出,我们会注意到这一点。真不敢相信,没有人,包括我在内,想让你发布这篇文章。我知道
查找
未排序的结果。在这种情况下,在
find
之后执行
sort
没有意义,因为文件具有不同的命名约定,并且不会按日期排序。这就是我需要用正则表达式提取日期的原因。为什么要通过管道将sed输出进行排序,或者不进行排序?
$ find xml/ -type f -name "*.201604*.xml" | head -5 | sed "s/.*\.\(2016[0-9]\{4\}\)\(.*\)/\1/g"
20160403
20160401
20160401
20160412
20160405