使用sed时未终止的地址regex



我正试图使用sed命令来查找并打印出现在"\MP2="one_answers"\"之间的数字,该数字出现在一个大型.log文件中的一行中,如下所示

MP2=-193.0977448

我正在使用下面的命令,并得到以下错误:

sed "/MP2=/,//p" input.log
sed: -e expression #1, char 12: unterminated address regex

关于如何改变这一点的建议将不胜感激!

从表面上看,您只需要将反斜杠加倍(通常最好在sed程序周围使用单引号):

sed '/\MP2=/,/\/p' input.log

为什么?双反斜杠是告诉sed查找一个反斜杠所必需的。shell还解释双引号字符串中的反斜杠,这会使事情变得复杂(您需要写4个反斜杠来确保sed看到2并将其解释为"查找1个反斜杠")——使用单引号字符串可以避免这个问题。

然而,/pat1/,/pat2/表示法指的是两条独立的线。看起来你真的想要:

sed -n '/\MP2=.*\/p' input.log

-n抑制默认打印(可能也是第一种选择的好主意),并且该模式查找包含MP2=的单行,最后是一个反斜杠。

如果你只想打印数字(正如问题所说),那么你需要更加努力。您需要匹配行上的所有内容,但只捕获"数字",并在打印剩余内容(仅为数字)之前删除除数字之外的所有内容:

sed -n '/.*\MP2=([^]*)\.*/ s//1/p' input.log

您不需要[^](否定)字符类中的双反斜杠,尽管它没有害处。

如果起始模式和结束模式在同一行,则需要替换。从与r1匹配的(整个)到与r2匹配的下一整行,范围表达式/r1/,/r2/为true。

你想要这个;

sed -n 's/.*\MP2=([^\]*)\.*/1/p' file

这只提取匹配项,只将整行替换为匹配项(转义括号创建一个组,您可以在替换中引用该组;这被称为反向引用。一些sed方言不希望在分组括号之前有反斜杠。)

awk是一个更好的工具:

awk -F= '$1=="MP2" {print $2}' RS='' input.log

设置记录分隔符为\,字段分隔符为'=',这很简单。

相关内容

  • 没有找到相关文章

最新更新