使用sed

时间:2016-06-04 05:11:47

标签: bash sed

我正在尝试使用sed命令查找并打印“。\ MP2 =”和“\”之间出现的数字,该行显示在大型.log文件中的这一行中

\MP2=-193.0977448\

我正在使用以下命令并收到以下错误:

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

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

3 个答案:

答案 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

将记录分隔符设置为\并将字段分隔符设置为' =',这非常简单。