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服务器上有一个根提示符,这意味着您可能正在运行Solarissh
——与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