我正在尝试使用sed命令查找并打印“。\ MP2 =”和“\”之间出现的数字,该行显示在大型.log文件中的这一行中
\MP2=-193.0977448\
我正在使用以下命令并收到以下错误:
sed "/\MP2=/,/\/p" input.log
sed: -e expression #1, char 12: unterminated address regex
如何改变这一点的建议将不胜感激!
答案 0 :(得分:3)
从表面上看,你只需要加倍反斜杠(通常最好在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
你不需要[^\]
(否定)字符类中的双反斜杠,尽管它没有任何伤害。
答案 1 :(得分:1)
如果起始和结束模式在同一行,则需要替换。范围表达式/r1/,/r2/
在(整个)行中与r1
匹配,直到匹配r2
的下一整行。
你想要这个;
sed -n 's/.*\\MP2=\([^\\]*\)\\.*/\1/p' file
这只提取匹配,只用匹配替换整行(转义括号创建一个组,你可以在替换中引用回来;这称为后引用。一些sed
方言don& #39;在分组括号之前要反斜杠。)
答案 2 :(得分:0)
awk是一个更好的工具:
awk -F= '$1=="MP2" {print $2}' RS='\' input.log
将记录分隔符设置为\并将字段分隔符设置为' =',这非常简单。