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

时间:2019-07-04 07:13:19

标签: text awk sed gnu

我想匹配包含单词的文件中的所有行,并将所有行都放在下面,直到连续出现两个两个换行符为止。

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

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

我该如何修改以接受所有后续行?

例如,说我想用'dog'匹配行,以下内容应采用5的前3行:

The best kind of an animal is a dog, for sure
-man's best friend
-related to wolves

Racoons are not cute

有没有办法做到这一点?

4 个答案:

答案 0 :(得分:1)

这应该做:

__iter__

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

编辑:可以简化一些:

tmp

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

new

如果原始文件确实包含制表符或空格,而不是每个狗节之后仅包含空白行,请从awk '/dog/ {f=1;print ""> "new"} /^$/ {f=0} {print > (f?"new":"tmp")}' file && mv tmp file 更改为/^$/

答案 1 :(得分:1)

这可能对您有用(GNU sed):

sed 's|.*|/\\<&\\>/ba|' stringFile | 
sed -f - -e 'b;:a;w resultFile' -e 'n;/^$/!ba' file

从stringFile构建一组正则表达式,并将匹配项发送到:a。然后将匹配的行和其他所有行写入resultFile中直到空行(或文件末尾)。

结果可以使用以下命令直接发送到resultFile:

sed 's#.*#/\\<&\\>/ba#' stringFile |
sed -nf - -e 'b;:a;p;n;/^$/!ba' file > resultFile

要从原始文件中删除匹配项,请使用:

sed 's|.*|/\\<&\\>/ba|' stringFile |
sed -f - -e 'b;:a;N;/\n\s*$/!ba;w resultFile' -e 's/.*//p;d' file

答案 2 :(得分:0)

请您尝试以下。

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

答案 3 :(得分:0)

这是您要做什么吗?

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