我正试图使用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
设置记录分隔符为\,字段分隔符为'=',这很简单。