Bash sed-删除包含一种模式但不包含另一种模式的所有行

Bash sed-删除包含一种模式但不包含另一种模式的所有行,bash,sed,Bash,Sed,我想删除文件中包含一种模式但不包含另一种模式的所有行 例如,如果我有此文件: hello people foo hello world bar hello something blah blah blah 我想删除所有包含hello,但不包含world,因此我的文件如下所示: hello world bar blah blah blah 我尝试了以下方法: sed -n '/hello/p' file | sed -i '/world/!d' 但是我收到了错误消息-我可能不能与stdin一

我想删除文件中包含一种模式但不包含另一种模式的所有行

例如,如果我有此文件:

hello people foo
hello world bar
hello something
blah blah blah
我想删除所有包含
hello
,但不包含
world
,因此我的文件如下所示:

hello world bar
blah blah blah
我尝试了以下方法:

sed -n '/hello/p' file | sed -i '/world/!d'
但是我收到了错误消息
-我可能不能与stdin一起使用

sed  -i '/hello/{/world/!d}' file
这应该行得通

sed  -i '/hello/{/world/!d}' file
awk替代方案:

awk '!/hello/ ||/world/' file
awk替代方案:

awk '!/hello/ ||/world/' file
这个答案是不同的,因为为-i提供了一个扩展

我认为下面的线程应该是有用的

这个答案是不同的,因为为-i提供了一个扩展

我认为下面的线程应该是有用的


单个sed调用:

sed -n '/hello/ {/world/d; p}' file

对于匹配
/hello/
的行,如果它也匹配
/world/
delete,则打印单个sed调用:

sed -n '/hello/ {/world/d; p}' file

对于匹配
/hello/
的行,如果它也匹配
/world/
delete,则打印只需使用awk保持逻辑简单,如所述:

$ awk '/hello/ && !/world/{next} 1' file
hello world bar
blah blah blah

只需使用awk来保持逻辑简单,如下所述:

$ awk '/hello/ && !/world/{next} 1' file
hello world bar
blah blah blah

在玩了一轮之后,我能够获得一个实现
sed
的脚本,这对我很有用:

file=$1
patt=$(sed -n '/world/p' $file)
sed -n "/hello/!p;/$patt/p" $file

在玩了一轮之后,我能够获得一个实现
sed
的脚本,这对我很有用:

file=$1
patt=$(sed -n '/world/p' $file)
sed -n "/hello/!p;/$patt/p" $file


由于某些原因,它没有,我有一个名为git的文件,并且我以如下方式运行sed命令:sed-I'/hello/{/world/!d}'git。。。我得到了这个错误:sed:1:“git”:g命令末尾的额外字符与这里的@Bolboa结果相似,但错误是
sed:1:“testfile.txt”:未定义的标签“estfile.txt”
。在OSX10.9.5上测试。由于某些原因,它没有,我有一个名为git的文件,我运行sed命令如下:sed-I'/hello/{/world/!d}'git。。。我得到了这个错误:sed:1:“git”:g命令末尾的额外字符与这里的@Bolboa结果相似,但错误是
sed:1:“testfile.txt”:未定义的标签“estfile.txt”
。在OS X 10.9.5.hmmm上测试。。。这是我得到的错误:sed:1:“/hello/{/world/d;p}”:在p命令的末尾有额外的字符。。。有什么原因吗?很好的解决方案,格伦@Bolboa,检查你的语法,在Linux上完全按照
sed-n'/hello/{/world/d;p}'
的方式工作,这没有打印“blah blah blah'@DavidC.Rankin”行是的,我也非常喜欢这个解决方案,但我想我应该提到我正在使用OSX,这有什么区别吗?@Bolboa,查看OSX sed手册页:嗯。。。这是我得到的错误:sed:1:“/hello/{/world/d;p}”:在p命令的末尾有额外的字符。。。有什么原因吗?很好的解决方案,格伦@Bolboa,检查你的语法,在Linux上工作得非常完美,就像
sed-n'/hello/{/world/d;p}'
这不会打印“blah-blah-blah'@DavidC.Rankin”这样的行是的,我也非常喜欢这个解决方案,但我想我应该提到我正在使用OSX,这有什么不同吗?@Bolboa,查看OSX sed手册页:不幸的是,sed答案对我不起作用,所以我实现了这一点。这一点不修改文件,只返回输出。如何将其保存到文件?@BigDong
awk'…'file>hello.tmp和&mv hello.tmp文件
谢谢,这很有效。我为此做了
| tee文件
。你知道如何用
$HOSTNAME
替换
hello
吗?不幸的是,sed答案对我不起作用,所以我实现了这个答案。它不修改文件,只返回输出。如何将其保存到文件?@BigDong
awk'…'file>hello.tmp和&mv hello.tmp文件
谢谢,这很有效。我为此做了
| tee文件
。您知道如何用
$HOSTNAME
替换
hello
吗?这与您20分钟前发布的1_CR完全相同。@Jotne Yes。。我认为没有扩展名的-i可能是OP使用这个简单解决方案出错的原因(因为我没有OSX,这是一个假设)。略有不同。这与你20分钟前发布的1_CR完全相同。@Jotne Yes。。我认为没有扩展名的-i可能是OP使用这个简单解决方案出错的原因(因为我没有OSX,这是一个假设)。稍有不同。