我想匹配包含单词的文件中的所有行,并将所有行都放在下面,直到连续出现两个两个换行符为止。
我有以下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
有没有办法做到这一点?
答案 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