Sed 匹配模式后的grep,但不包括期间
我有以下示例字符串:Sed 匹配模式后的grep,但不包括期间,sed,grep,matching,Sed,Grep,Matching,我有以下示例字符串: Program exiting with code: 0. Program exiting with code: 1. Program exiting with code: 10. 我希望grep在匹配模式“程序带代码退出:”后返回值。然而,我不需要最后的句号。我试过: grep "Program exiting with exit code:" dataload.log | sed 's/^.*.: //' 上述命令返回: 0. 1. 10. 我想忽略结尾的句号。我
Program exiting with code: 0.
Program exiting with code: 1.
Program exiting with code: 10.
我希望grep在匹配模式“程序带代码退出:”后返回值。然而,我不需要最后的句号。我试过:
grep "Program exiting with exit code:" dataload.log | sed 's/^.*.: //'
上述命令返回:
0.
1.
10.
我想忽略结尾的句号。我从某处收到了上面的命令
有人能描述一下每个关键字代表什么,并给我提供一个正则表达式,它只给我提供不带句号的值吗
sed
、awk
、perl
或任何其他方式对我都合适
sed 's/^.*.: //'
首先,这是一个替换正则表达式,如开头的s
所示。第一个/
中的部分是要匹配的部分,第二个/
中的部分是要替换的部分
表达式的第一(匹配)部分中的字符都是特殊的正则表达式字符
可在此处找到其含义的完整列表:
比赛的意思是:
^
-在行首
-匹配任何字符
*
-任意次数
-匹配任何字符
:
-匹配冒号
-匹配空格
然后这些都被什么都没有取代了。这就是为什么保留结尾处的句点,因为它删除了所有直到程序以代码退出时的内容:
,剩下1。
使用交互式工具测试字符串上的不同正则表达式是值得的,例如
您可能只需替换/删除本例中不是数字的所有内容:
's/[^0-9]//g'
只需使用grep并向后查看,只捕获数字:
$ grep -Po '(?<=Program exiting with code: )\d*' file
0
1
10
$grep-Po'(?如果您使用cut
命令扩展它,您的解决方案就很好了:
grep”程序正在退出,代码为:“dataload.log | sed's/^....:/'| cut-d”。-f1
这是另一种方式:
grep -oE 'Program exiting with code:\s*[0-9]+' dataload.log |grep -oE '[0-9]+$'
第一个grep命令的输出为:
Program exiting with code: 0
Program exiting with code: 1
Program exiting with code: 10
然后你只需grep
最后的数字。很好,你可以解释为什么它不起作用。但是,建议的方法有点脆弱,因为它不检查数字是否应该在程序退出后的代码:
。有很多方法可以做到。而且,如果所有输出与给定的示例不匹配。下面是另一个匹配组的解决方案:sed的/程序退出时使用代码:\([0-9]*\)\。/\1/“
还有另一个问题:不以程序退出…
开头的行将保持不变。@AdamTaylor,感谢您的详细解释。regex的/[^0-9]//g'对我来说很好,并且按照我当前的要求很好,因为这就是字符串在我的文件中始终存在的方式。谢谢投票否决它的目的是什么?我刚刚指出了OP自己的解决方案并对其进行了扩展。这就是我的工作片段在使用@AdamTaylor@Ki提供的解决方案后的样子ranSavadatti它与GNU grep和您提供的输入一起工作。用您使用的grep版本的描述更新您的问题。