Regex Shell替换/替换在Perl和SED中无法正常工作
我有许多字符串的格式:Regex Shell替换/替换在Perl和SED中无法正常工作,regex,perl,shell,sed,substitution,Regex,Perl,Shell,Sed,Substitution,我有许多字符串的格式: Sys!CTP_Live83000_@DRS_named_error_out_1 EServerJTP!CTP_Live56000_@input_error_queue_205 我试图删除结尾的“_编号”,即“_1”和“_205”,但遇到了一些问题 到目前为止,我已经提出了两个解决方案,这两个都不是我想要的 1) 使用Perl,这将用空格替换字符串末尾的下划线和数字,但也将替换字符串中出现的所有u ...|/usr/bin/perl -pi -e 's/[_][0-9]
Sys!CTP_Live83000_@DRS_named_error_out_1
EServerJTP!CTP_Live56000_@input_error_queue_205
我试图删除结尾的“_编号”,即“_1”和“_205”,但遇到了一些问题
到目前为止,我已经提出了两个解决方案,这两个都不是我想要的
1) 使用Perl,这将用空格替换字符串末尾的下划线和数字,但也将替换字符串中出现的所有u
...|/usr/bin/perl -pi -e 's/[_][0-9]*/ /g'
2) 使用SED,可以保持字符串中的下划线不变,但只删除(替换为空格)字符串末尾的下划线和第一个数字,如果是2位和3位数字,则会保留一些数字:
...|sed 's/[_][0-9]/ /'
这在Solaris 5.10服务器上
我做错了什么?谢谢
sed的/[0-9][0-9]*$/'
应该可以做到这一点
输出为:
Sys!CTP_Live83000_@DRS_named_error_out
EServerJTP!CTP_Live56000_@input_error_queue
诀窍是使用美元符号强制它找到行尾。您可以:
sed 's/_[0-9]\+$//'
它将匹配行或模式($
)末尾的下划线\
和数字(一个或多个(+
)数字[0-9]
)
当然,您也可以使用字符列表:
sed 's/_[[:digit:]]\+$//'
启用-r
后,无需引用+
:
sed -r 's/_[0-9]+$//'
sed -r 's/_[[:digit:]]+$//'
您还可以选择添加额外的填充图案,以捕获额外的尾随空格:
sed -r 's/_[0-9]+[ \t\r]*$//'
假设您的输入在
文件中
:
sed -e 's/_[[:digit:]]\{1,\}$//' file
将删除下划线,并在每行末尾添加一个或多个数字。请注意,
不需要它自己的字符类[\u]
。这是POSIX兼容的,因此无论您的sed版本如何,都应该可以工作。如果输入通过管道传输到sed中,它也应该同样工作良好
在您的问题中使用[0-9]*
的问题是,这意味着零或更多,因此任何下划线都将匹配完整表达式并被删除
看起来你的sed版本很旧了!与使用POSIX字符类相比,使用
[0-9]
可能更成功:
sed -e 's/_[0-9]\{1,\}//'
我还删除了行末尾的锚定符
$
,以防引起任何问题。问题是[0-9]*
允许零位或多位数字,从而允许正则表达式匹配裸下划线.
要确保至少有一个数字,您可以使用+
而不是*
在这里,/g
选项是不合适的,因为您只想替换模式的一个匹配项,而如果您总是使用此命令,则-i
perl选项是不相关的,因此
perl -pe 's/_[0-9]+/ /'
您是想完全删除
\u编号
还是用空格替换?谢谢大家的回答,非常感谢。我尝试了所有的SED解决方案,但是没有一个能够正常工作,但是perl解决方案确实有效。我不知道为什么SED解决方案不起作用,我以前在这台服务器上遇到过SED问题,我问过服务器管理人员是否安装了非标准的SED版本,但他们确认这是Solaris附带的默认版本?我很惊讶我的解决方案不起作用,因为它实际上是与Perl答案相同的正则表达式,并且与POSIX完全兼容(所以应该适用于任何版本的sed)。您可以sed--version
了解您使用的版本。@skamazin理想情况下,我想用相同数量的空格替换“\u号”,但是由于sed无法正常工作的问题,我有点放弃了这个想法,选择了B计划,简单地删除它。我只是看了一下你的SunOS版本附带的sed版本的主页。我认为我的建议的问题可能是[:digit:][/code>字符类。我在回答中添加了另一个建议,我很想知道它是否有效!可能值得一提的是,虽然-i
不会产生任何负面影响,但如果输入是在STDIN上,那么它也可以被删除(正如问题中所显示的那样)。后一个版本给出了所需的结果(与Borodin的perl命令完全相同)。感谢您的贡献和关于SED版本非常旧的信息!我以后会记住这一点。