Text 剪切匹配行和X连续行,直到换行并粘贴到文件中

Text 剪切匹配行和X连续行,直到换行并粘贴到文件中,text,awk,sed,gnu,Text,Awk,Sed,Gnu,我想匹配包含单词的文件中的所有行,并将所有行置于下面,直到一行中出现两个换行符 我有以下sed代码来剪切和粘贴特定行,但不包括后续行: sed 's|.*|/\\<&\\>/{w results\nd}|' teststring | sed -file.bak -f - testfile 有什么方法可以做到这一点吗?请尝试下面的方法 awk '/dog/{count="";found=1} found && ++count<4' Input_file

我想匹配包含单词的文件中的所有行,并将所有行置于下面,直到一行中出现两个换行符

我有以下sed代码来剪切和粘贴特定行,但不包括后续行:

sed 's|.*|/\\<&\\>/{w results\nd}|' teststring | sed -file.bak -f - testfile

有什么方法可以做到这一点吗?

请尝试下面的方法

awk '/dog/{count="";found=1} found && ++count<4'  Input_file > temp && mv temp Input_file

awk'/dog/{count=”“;found=1}found&&++count您可以尝试以下内容吗

awk '/dog/{count="";found=1} found && ++count<4'  Input_file > temp && mv temp Input_file
awk'/dog/{count=”“;found=1}found&&++count这应该可以:

awk '/dog/ {f=1} /^$/ {f=0} f {print > "new"} !f {print > "tmp"}' file && mv tmp file
如果找到word
dog
,它会将
f
设置为true,如果找到空行,则将
f
设置为false。
如果
f
为真,则打印到
new
文件。
如果
f
为false,则打印到
tmp
文件。
tmp
文件复制到原始文件

编辑:可以缩短一些:

awk '/dog/ {f=1} /^$/ {f=0} {print > (f?"new":"tmp")}' file && mv tmp file
Edit2:根据要求,为
新文件中的每个部分添加空间:

awk '/dog/ {f=1;print ""> "new"} /^$/ {f=0} {print > (f?"new":"tmp")}' file && mv tmp file
如果原始文件确实包含制表符或空格,而不是每个dog部分后面的空行,请将
/^$/
更改为
/^[\t]*$/
,这应该可以:

awk '/dog/ {f=1} /^$/ {f=0} f {print > "new"} !f {print > "tmp"}' file && mv tmp file
如果找到word
dog
,它会将
f
设置为true,如果找到空行,则将
f
设置为false。
如果
f
为真,则打印到
new
文件。
如果
f
为false,则打印到
tmp
文件。
tmp
文件复制到原始文件

编辑:可以缩短一些:

awk '/dog/ {f=1} /^$/ {f=0} {print > (f?"new":"tmp")}' file && mv tmp file
Edit2:根据要求,为
新文件中的每个部分添加空间:

awk '/dog/ {f=1;print ""> "new"} /^$/ {f=0} {print > (f?"new":"tmp")}' file && mv tmp file
如果原始文件确实包含制表符或空格,而不是每个dog部分后面的空行,请将
/^$/
更改为
/^[\t]*$/
,这可能适用于您(GNU-sed):

要从原始文件中剪切匹配项,请使用:

sed 's|.*|/\\<&\\>/ba|' stringFile |
sed -f - -e 'b;:a;N;/\n\s*$/!ba;w resultFile' -e 's/.*//p;d' file
sed的|..*/\\\/ba |字符串文件|
sed-f--e'b;:A.N/\n\s*$/!文学士;w resultFile'-e's/*///p;d'文件
这可能适合您(GNU-sed):

要从原始文件中剪切匹配项,请使用:

sed 's|.*|/\\<&\\>/ba|' stringFile |
sed -f - -e 'b;:a;N;/\n\s*$/!ba;w resultFile' -e 's/.*//p;d' file
sed的|..*/\\\/ba |字符串文件|
sed-f--e'b;:A.N/\n\s*$/!文学士;w resultFile'-e's/*///p;d'文件

这就是你想要做的吗

$ awk -v RS= '/dog/' file
The best kind of an animal is a dog, for sure
-man's best friend
-related to wolves

这就是你想做的吗

$ awk -v RS= '/dog/' file
The best kind of an animal is a dog, for sure
-man's best friend
-related to wolves


@WiktorStribiżew表示regexp可以匹配,但是如何移动到新文件并使用awk从原始文件中删除?@WiktorStribiżew在本例中,我使用take表示“剪切”,剪切并粘贴到新文件中。所以这3行代码不会出现在testfile中,但会出现在newfileSo中,它还没有解决吗?请编辑问题以包含更多详细信息。@WiktorStribiżew regexp可以匹配,但如何移动到新文件并使用awk从原始文件中删除?@WiktorStribiżew在本例中,我使用take表示“剪切”,剪切并粘贴到新文件中。所以这3行代码不会出现在testfile中,但会出现在newfileSo中,它还没有解决吗?请编辑问题以包含更多细节。实际上,这似乎占用了很多与术语不匹配的行…我如何帮助解决问题?@JakeRankin Kan您给出的示例输入不起作用?我在提供示例输入时遇到问题。当我在一个大文件(300k textfile)上使用时,似乎大多数行都匹配,尽管它们不匹配,因为它们最终会出现在新文件中。当我用最后10行进行测试时,它似乎起到了应有的作用。有没有办法在匹配并剪切/粘贴到新文件的每个部分后添加一个换行/空行?@JakeRankin参见edit2。它在新文件的每个部分前都添加了一条闪烁线实际上这似乎占用了很多与术语不匹配的行…我如何帮助排除故障?@JakeRankin Kan你给出的示例输入不起作用?我在提供示例输入时遇到了问题。当我在一个大文件(300k textfile)上使用时,似乎大多数行都匹配,尽管它们不匹配,因为它们最终会出现在新文件中。当我用最后10行进行测试时,它似乎起到了应有的作用。有没有办法在匹配并剪切/粘贴到新文件的每个部分后添加一个换行/空行?@JakeRankin参见edit2。在新文件的每个部分之前添加一条闪烁线这会不会也从原始文件中删除匹配的行?哦,对不起,要剪切原始文件,请参阅第三个解决方案这可能是一个愚蠢的问题,但我不确定将该术语放在哪里匹配。它是代替stringFile中的
要匹配的单词go,还是像你所做的那样
测试字符串
,每行一个,也就是说,如果你把
放在第一行,把
放在第二行,那么匹配狗或猫的行直到下一个空行,将被剪切并粘贴到结果文件中。啊,我明白了,我有点不确定,谢谢你现在测试这会从原始文件中删除匹配的行吗?哦,对不起,要剪切原始文件,请参阅第三个解决方案这可能是一个愚蠢的问题,但我不确定将术语放在哪里匹配。它是代替stringFile中的
要匹配的单词go,还是像你所做的那样
测试字符串
,每行一个,也就是说,如果你把
放在第一行,把
放在第二行,那么匹配狗或猫的行直到下一个空行,将被剪切并粘贴到结果文件中。啊,我明白了,我有点不确定,谢谢你的测试now@JakeRankin,谢谢你,杰克。另外,我已经更改了将输出保存到输入文件本身的命令,请告诉我这是否有帮助?@JakeRankin,谢谢你,Jake。另外,我已经更改了将输出保存到输入文件本身的命令,请告诉我这是否有帮助?您的解决方案将只测试记录是否包含
dog
,而不是以
dog
开头的行。不确定这是否正确。您的解决方案将只测试记录是否包含
dog
,而不是以
dog
开头的行。不确定这是否是你的意图。