Unix sed命令,用于在模式范围之间排除文件中的特定行
我希望使用sed命令进行替换,但这也不应应用于与某些模式/单词匹配的特定行范围 文件包含以下行:Unix sed命令,用于在模式范围之间排除文件中的特定行,unix,awk,sed,Unix,Awk,Sed,我希望使用sed命令进行替换,但这也不应应用于与某些模式/单词匹配的特定行范围 文件包含以下行: 1 顶部 美好的 好的 坏的 美好的 美好的 维里巴德 极坏 坏的 美好的 终点线1 美好的 我这边的线索: sed-i'/startine1/,/endline1/s/nice/delegate/” 替换必须发生在1和endline1 但是必须排除bad和verybad单词之间的更新 使用上述命令,我得到如下结果: 1 顶部 得体的 好的 坏的 得体的 得体的 维里巴德 极坏 坏的 得体的 终点
1
顶部
美好的
好的
坏的
美好的
美好的
维里巴德
极坏
坏的
美好的
终点线1
美好的
我这边的线索:
sed-i'/startine1/,/endline1/s/nice/delegate/”
替换必须发生在1
和endline1
但是必须排除bad
和verybad
单词之间的更新
使用上述命令,我得到如下结果:
1
顶部
得体的
好的
坏的
得体的
得体的
维里巴德
极坏
坏的
得体的
终点线1
美好的
- 这将只在
和startline1
之间进行替换,这与预期一致endline1
- 但是现在我不希望更新发生在
和bad
之间verybad
1
顶部
得体的
好的
坏的
美好的
美好的
维里巴德
极坏
坏的
得体的
终点线1
美好的
关于这方面的任何建议都会有所帮助。请您根据展示的样品尝试以下内容。在link中测试成功 说明:首先检查行是否以
bad开头
设置bad\u找到
的条件,然后检查行是否以verybad开头
然后取消设置bad\u找到
如果一行包含endline1
,则检查条件,然后取消设置found
(在解释中进一步解释了找到的变量工时)。然后检查行是否包含startline1
,然后在此处设置变量found
。然后,如果设置了found
,并且未设置变量bad\u found
,则检查条件,然后在该行中将nice替换为delegate(其中,found确保我们是令人吃惊的终点线边界)。最后提到1
将打印所有行
注意:如果您的输入文件的行可能出现一次以上的nice
,则将上述代码中的sub
更改为gsub
。这可能对您有效(GNU-sed):
将收集start
和end
之间的行,然后一次处理一行
如果模式空间包含多行,即行已被收集,则如果这些行中的第一行包含bad
,并且后面有一行包含verybad
,则通过复制当前模式空间在保留空间中设置标志
如果保持空间不为空,且第一行为verybad
则保持空间为空,从而打开s/nice/delegate/
注意:解决方案使用控制流,即D
命令继续处理当前多行,直到图案空间为空
如果一行中出现多个nice
,请使用惯用语:
`:c;s/^\([^\n]*\)nice/\1decent/;tc`
为什么是sed而不是awk?你真的想要数据中的字符和数字吗?或者这只是你能找到的唯一一种逐行显示数据的方法吗?(我理解,对新手来说有点沮丧)。祝你好运。不需要项目符号或数字。awk我还没有尝试过这不会再现所需的输出,即
nice
的最后一次出现应该是delegate
,因为在最后一次bad
之前没有后续verybad
。否则,sed'/start/,/end/{/bad/,/verybad/b;s/nice/delegate/}文件将符合要求。@poton,您好,先生,当我为给定的示例运行代码时,最后一次出现是很好的,请检查链接我提到过它,并仅根据显示的示例编写此链接,先生。在您要求我检查的解决方案中,stdin的第11行是nice
,经过处理后仍然是nice
,OP表示第11行的预期结果从nice
变为delegate
,因为它介于开始
和结束
之间,但不在坏
和verybad
之间verybad
必须存在,才能排除替换的行,因此不能通过一次读取一行来确定,必须提前查找。@potong,ohh不确定怎么错过了它,抱歉,将在某个时候修复它,感谢您让我知道先生和++的代码再次感谢。@potong,sed'/start/,/end/{/bad/,/verybad/b;s/nice/delegate/}文件,这也有帮助。非常感谢
sed '/\n/bb;/^start/{:a;N;/^end/M!ba;:b;/^bad.*verybad/h;x;/./{/^verybad/z;s/[^\n]*\n//;x;P;D};x;s/^nice/decent/;P;D}' file
`:c;s/^\([^\n]*\)nice/\1decent/;tc`