Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Shell替换/替换在Perl和SED中无法正常工作_Regex_Perl_Shell_Sed_Substitution - Fatal编程技术网

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版本非常旧的信息!我以后会记住这一点。