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



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

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

为什么?还有人有这种行为吗?

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(或which sedwhence sed或...

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

最新更新