Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何使用sed查找具有特定字符串的行并输出到新文件_Regex_Linux_Sed - Fatal编程技术网

Regex 如何使用sed查找具有特定字符串的行并输出到新文件

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 '

我正在学习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
我尝试过的所有变化都没有起到任何作用。它会创建一个空文件

任何帮助都将不胜感激:)

使用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