Regex 如何使用sed查找具有特定字符串的行并输出到新文件
我正在学习sed,所以请容忍我。我试图使用sed在日志中查找包含“install”的所有文件,并将其输出到新文件。以下是正在搜索的文件的示例:Regex 如何使用sed查找具有特定字符串的行并输出到新文件,regex,linux,sed,Regex,Linux,Sed,我正在学习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 '
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
我尝试过的所有变化都没有起到任何作用。它会创建一个空文件
任何帮助都将不胜感激:)使用sed
请注意,以下内容不返回任何内容:
$ 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
或:
兼容性
在非常旧版本的GNU-sed上,不能使用-E
。必须改用-r
:
sed -rn '/[0-9]{2} install/p' file > new.txt
使用grep
此任务不需要sed的许多高级功能<代码>grep足够:
$ grep -E '[0-9]{2} install' file
2016-05-04 07:38:46 install libcairomm
或:
您的命令sed-n'/[0-9]{2}install/p'>new.txt正在使用基本正则表达式或BRE。手册解释了BRE和扩展RE或ERE之间的区别 要解决您的问题,请将ERE与
-E
或-r
标志一起使用:
sed -rn '/[0-9]{2} install/p' > new.txt
或者,使用反斜杠来避开BRE中的大括号:
sed -n '/[0-9]\{2\} install/p' > new.txt
可能是awk的复制品可能更有意义?哦,我明白了,我也忘了输入。非常感谢。这是一个有益的建议explanation@rrfeva很高兴这有帮助。
sed -rn '/[0-9]{2} install/p' > new.txt
sed -n '/[0-9]\{2\} install/p' > new.txt