【发布时间】:2014-09-22 06:47:44
【问题描述】:
我有一些格式为:
Sys!CTP_Live83000_@DRS_named_error_out_1
EServerJTP!CTP_Live56000_@input_error_queue_205
我正在尝试从末尾删除“_number”,即“_1”和“_205”,但遇到了一些麻烦。
到目前为止,我已经提出了 2 个解决方案,但都没有达到我想要的效果
1) 使用 Perl,这会将字符串末尾的下划线和数字替换为空格,但它也会替换字符串中所有出现的 _。
...|/usr/bin/perl -pi -e 's/[_][0-9]*/ /g'
2) 使用 SED,这将保持字符串中的下划线完整,但仅删除(替换为空格)字符串末尾的下划线和第一个数字,在 2 位和 3 位数字的情况下,保留一些数字:
...|sed 's/[_][0-9]/ /'
这是在 Solaris 5.10 服务器上。
我做错了什么?谢谢!
【问题讨论】:
-
您是要完全删除
_number还是用空格替换它? -
谢谢大家的回答,非常感谢。我尝试了所有 SED 解决方案,但我无法让它们中的任何一个工作,但 perl 解决方案确实有效。我不确定为什么 SED 解决方案不起作用,我过去在这台服务器上遇到过 SED 问题,我问过管理服务器的人是否安装了非标准版本的 SED,但他们确认它是 Solaris 捆绑的默认版本?
-
我很惊讶我的解决方案不起作用,因为它实际上是与 Perl 答案相同的正则表达式,并且完全兼容 POSIX(因此应该适用于任何版本的 sed)。您可以
sed --version了解您使用的版本。 -
@skamazin 理想情况下,我想用相同数量的空格替换“_number”,但是由于 SED 无法按预期工作的问题,我有点放弃了这个想法并与计划 B 一起去,就是简单地删除它。
-
我刚刚查看了您的 SunOS 版本附带的 sed 版本的联机帮助页。我认为我的建议的问题可能是
[:digit:]字符类。我在回答中添加了另一个建议,我很想知道它是否有效!
标签: regex perl shell sed substitution