Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix sed命令,用于在模式范围之间排除文件中的特定行_Unix_Awk_Sed - Fatal编程技术网

Unix sed命令,用于在模式范围之间排除文件中的特定行

Unix sed命令,用于在模式范围之间排除文件中的特定行,unix,awk,sed,Unix,Awk,Sed,我希望使用sed命令进行替换,但这也不应应用于与某些模式/单词匹配的特定行范围 文件包含以下行: 1 顶部 美好的 好的 坏的 美好的 美好的 维里巴德 极坏 坏的 美好的 终点线1 美好的 我这边的线索: sed-i'/startine1/,/endline1/s/nice/delegate/” 替换必须发生在1和endline1 但是必须排除bad和verybad单词之间的更新 使用上述命令,我得到如下结果: 1 顶部 得体的 好的 坏的 得体的 得体的 维里巴德 极坏 坏的 得体的 终点

我希望使用sed命令进行替换,但这也不应应用于与某些模式/单词匹配的特定行范围

文件包含以下行:

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`