对sed输出进行排序会在Solaris 10和11上产生不同的结果

时间:2016-04-19 12:30:28

标签: 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 | 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 xml/ -type f -name "*.201604*.xml" | head -5 | sed "s/.*\.\(2016[0-9]\{4\}\)\(.*\)/\1/g"
20160403
20160401
20160401
20160412
20160405

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

3 个答案:

答案 0 :(得分:1)

find提供未分类的结果。在使用find之前对head -5的输出进行排序 另外set LC_ALL=C

答案 1 :(得分:1)

您致电sort后呼叫sed,因此sort无法影响sed的行为方式。您只是在每台计算机上选择不同版本的sed,可能是一个来自/ bin的,它不了解转义的ERE字符以创建RE间隔(\{4\})而另一个来自/ usr / xpg4 / bin或类似的。

如果没有一些环境变化,你说Solaris 11的行为不同,有或没有排序是不可能的 - 也许你在一个不同的shell或运行不同的设置脚本或其他东西。

在两台计算机上执行where sed(或which sedwhence sed或......)

答案 2 :(得分:0)

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