在特定的 grep 匹配之后,我想将文件的以下所有内容传输到另一个文件

在特定的 grep 匹配之后,我想将文件的以下所有内容传输到另一个文件

我有一个包含以下行的文本文件:

This is the first line
Second line
I have a mac
Used to have windows
Comfortable with both

所以现在我想 grep “I have a mac”,并将后面的所有内容移动到一个新文件中。我该怎么做?谢谢!

答案1

裁剪包含以下内容的行中的所有内容“我有一台 Mac”到文件末尾并将输出写入新文件:

sed -n '/I have a mac/,$ p' in-file > out-file

删除包含以下内容的行中的所有内容“我有一台 Mac”到文件末尾,在文件的位置进行更改并创建原始文件的备份副本:

sed '/I have a mac/,$ d' in-file -i.bak

使用包含您要搜索的字符串的变量并有条件地执行上述两个命令:

SEARCH='I have a mac'
sed -n "/$SEARCH/,$ p" in-file > out-file && sed "/$SEARCH/,$ d" in-file -i.bak

使用 grep (递归)查找哪些文件包含搜索的字符串,并通过管道将其名称传递xargs给上述命令(参考):

export SEARCH='I have a mac'
grep -lr "$SEARCH" | xargs -L1 -I {} sh -c 'sed -n "/$SEARCH/,$ p" {} > {}.out && sed "/$SEARCH/,$ d" {} -i.bak'

答案2

grep可以使用-Aswitch ( -->After Context) 并| tail -n+2以第二行开始输出以跳过匹配。

grep -A $(wc -l < file) mac file | tail -n+2

sed对于这种情况,使用可能更好:

sed '1,/mac/d' file

d删除从第一行 (1) 到匹配行的所有内容。

或者你可以使用awk

awk '{if(m)print}/mac/{m=1}' file

当变量 m 为真时将打印一行if(m)print},在第一次匹配后将其设置为 1/true /mac/{m=1}


stdout可以通过重定向从命令“传输”到文件:> another_file

sed '1,/mac/d' file > another_file
#or
awk '{if(m)print}/mac/{m=1}' file > another_file

相关内容