Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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
Sed 从模式匹配之间的文件中删除行_Sed_Shell - Fatal编程技术网

Sed 从模式匹配之间的文件中删除行

Sed 从模式匹配之间的文件中删除行,sed,shell,Sed,Shell,如何使用删除文件中两个图案之间的所有线条 这里的模式是//test和//endtest,文件内容: blah blah blah c f f [ ] //test all text to be deleted line1 line2 xyz amv { //endtest l dsf dsfs 预期结果: blah blah blah c f f [ ] //test //endtest l dsf dsfs 使用awk: $ awk '/\/\/endtest/{p=0} !p; /\/

如何使用删除文件中两个图案之间的所有线条

这里的模式是//test和//endtest,文件内容:

blah blah blah
c
f
f
[
]
//test
all text to be deleted 
line1
line2
xyz
amv
{
//endtest
l
dsf
dsfs
预期结果:

blah blah blah
c
f
f
[
]
//test
//endtest
l
dsf
dsfs
使用awk:

$ awk '/\/\/endtest/{p=0} !p; /\/\/test/{p = 1}' file
blah blah blah
c
f
f
[
]
//test
//endtest
l
dsf
dsfs
使用awk:

$ awk '/\/\/endtest/{p=0} !p; /\/\/test/{p = 1}' file
blah blah blah
c
f
f
[
]
//test
//endtest
l
dsf
dsfs
这是sed的共同特征 由于/用于绑定正则表达式,因此必须在正则表达式中转义它们

如果要按要求保留标记:

sed '/^\/\/test$/,/^\/\/endtest/{//!d}'
说明:

查看信息sed,搜索sed地址->Regexp地址和范围地址

由{…}包围的符号//表示任何边界

空正则表达式“//”重复最后一个正则表达式 如果空正则表达式为 传递给“s”命令

!!表示不,然后d表示删除行

备选方案:你可以写:

sed '/^\/\/\(end\)\?test$/,//{//!d}' 

将起同样的作用,但请注意,若在第一次打开模式//测试之前可能存在一些额外的模式//结束测试,则这可能会逆转效果

。。。所有这些都是使用GNU sed 4.4完成的

在MacOS下,BSD sed 在MacOS下,我成功地删除了以下语法的通缉行:

sed '/^\/\/test$/,/^\/\/endtest/{/^\/\/\(end\)\{0,1\}test$/!d;}'

这是sed的共同特征 由于/用于绑定正则表达式,因此必须在正则表达式中转义它们

如果要按要求保留标记:

sed '/^\/\/test$/,/^\/\/endtest/{//!d}'
说明:

查看信息sed,搜索sed地址->Regexp地址和范围地址

由{…}包围的符号//表示任何边界

空正则表达式“//”重复最后一个正则表达式 如果空正则表达式为 传递给“s”命令

!!表示不,然后d表示删除行

备选方案:你可以写:

sed '/^\/\/\(end\)\?test$/,//{//!d}' 

将起同样的作用,但请注意,若在第一次打开模式//测试之前可能存在一些额外的模式//结束测试,则这可能会逆转效果

。。。所有这些都是使用GNU sed 4.4完成的

在MacOS下,BSD sed 在MacOS下,我成功地删除了以下语法的通缉行:

sed '/^\/\/test$/,/^\/\/endtest/{/^\/\/\(end\)\{0,1\}test$/!d;}'


如果您的数据在“d”文件中,请尝试gnu sed:

sed -E '/\/\/test/,/\/\/endtest/{/\/\/.*test/!d}' d

如果您的数据在“d”文件中,请尝试gnu sed:

sed -E '/\/\/test/,/\/\/endtest/{/\/\/.*test/!d}' d

你应该删除你的答案,因为上面清楚地写着应该用sed解决这个问题。或者?@YesThatIsMyName否,问题是在我回答之后编辑的,您将收到我的提示:-D@YesThatIsMyName人们经常用一些特定的工具发帖询问答案,只是因为他们不知道更好的答案。将答案限制在他们要求的工具上,除非他们非常明确,他们只能使用该工具,而使用其他工具有更好的解决方案,这是没有用的。在这种情况下,sed和awk都是每个UNIX安装中都存在的标准工具,人们经常会对它们中的哪一个用于哪一个任务感到困惑,因此人们通常在1中要求解决方案,在另一个中接受解决方案。@EdMorton感谢您的详细解释。您应该删除您的答案,因为答案很清楚书面说明解决方案应使用sed解决。或者?@YesThatIsMyName否,问题是在我回答之后编辑的,您将收到我的提示:-D@YesThatIsMyName人们经常用一些特定的工具发帖询问答案,只是因为他们不知道更好的答案。将答案限制在他们要求的工具上,除非他们非常明确,他们只能使用该工具,而使用其他工具有更好的解决方案,这是没有用的。在这种情况下,sed和awk都是每个UNIX安装中都存在的标准工具,人们经常会对它们中的哪一个用于哪一个任务感到困惑,因此人们通常会在1中要求解决方案,在另一个中接受解决方案。@EdMorton感谢您的详细解释。另请参阅awk是否适合您应该检查一下我前一段时间写的这个答案:不要使用范围表达式,因为它们会使琐碎的任务变得非常简单,但当您的需求稍有变化时,就需要完全重写或复制代码,例如测试范围内的某个值或包括/排除范围开始/结束行。改用标志变量。由于sed没有变量,这意味着您不应该在此类任务中使用sed,只需使用awk即可,例如,请参阅。如果awk对您来说是一个可行的替代方案,您应该检查一下我不久前写的这个答案:不要使用范围表达式,因为它们会使琐碎的任务变得非常简短,但当您的需求发生微小变化时,则需要完全重写或复制代码,例如,测试范围内的某个值或包括/排除范围开始/结束线。改用标志变量。由于sed没有表示您不应该在此类任务中使用sed的变量,因此只需使用awk即可,请参见示例。在错误sed'/^\/\/test$/,/^\/\/endtest/{///!d}'test.txt sed:bad regex:empty subexpression下获取错误sed'/^\/\/test$/,/^\/\/endtest/{//!d}'test.txt sed:错误 regex:empty subexpressionwich版本的sed和OS正在使用?