我正在学习sed,所以请耐心等待。我正在尝试使用sed来查找包含" install"的所有文件。在日志中并输出到新文件。这是搜索文件的一个示例:
2016-05-04 07:38:46 install libcairomm
2016-05-05 07:38:47 status half-installed libcairomm
2016-05-05 07:39:49 status unpacked libcairomm
所以,它只输出第一行。以下是我一直尝试的其他一些变化:
sed -n '/[0-9]{2} install/p' > new.txt
我尝试的所有变化都没有做任何事情。它会创建一个空文件。
任何帮助将不胜感激:)
答案 0 :(得分:1)
注意以下内容不返回任何内容:
$ sed -n '/[0-9]{2} install/p' file
但是,这有效:
$ sed -n '/[0-9]\{2\} install/p' file
2016-05-04 07:38:46 install libcairomm
问题在于,在sed的默认基本正则表达式中,{
和}
被视为普通字符。为了使它们与众不同,必须使用反斜杠进行转义。
或者,可以指定-E
,以便sed
使用更现代的扩展正则表达式:
$ sed -En '/[0-9]{2} install/p' file
2016-05-04 07:38:46 install libcairomm
要将输出保存在文件中,而不是在终端中显示,请重新添加重定向> new.txt
:
sed -n '/[0-9]\{2\} install/p' file > new.txt
或者:
sed -En '/[0-9]{2} install/p' file > new.txt
在非常旧版本的GNU sed上,不能使用-E
。必须使用-r
代替:
sed -rn '/[0-9]{2} install/p' file > new.txt
此任务不需要sed的许多高级功能。 grep
就足够了:
$ grep -E '[0-9]{2} install' file
2016-05-04 07:38:46 install libcairomm
或者:
grep -E '[0-9]{2} install' file >new.txt
答案 1 :(得分:0)
您的命令sed -n '/[0-9]{2} install/p' > new.txt
正在使用Basic RegEx或BRE。 The GNU Sed手册解释了BRE与扩展RE或ERE之间的区别。
要解决您的问题,请使用带有-E
或-r
标记的ERE:
sed -rn '/[0-9]{2} install/p' > new.txt
或者,使用反斜杠来转义BRE中的花括号:
sed -n '/[0-9]\{2\} install/p' > new.txt