我有一个命令可以从文件名中提取日期并计算唯一的日期:
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
为什么呢?其他人有这种行为吗?
答案 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 sed
或whence sed
或......)
答案 2 :(得分:0)
通过unset LANG
解决了问题。它被设置为en_US.UTF-8
。 man
表示LANG
影响sed
命令执行。