求助:文本文件匹配删除

sh/bash/dash/ksh/zsh等Shell脚本
头像
nyfair
帖子: 1067
注册时间: 2007-12-07 12:49
系统: winnux10
来自: Tree New Bee

求助:文本文件匹配删除

#1

帖子 nyfair » 2012-02-08 22:08

有个文本文件里面有很多这样的东西
ifneq ($(TEST) 1)
...
...
...
endif

有没有什么能把所有从ifneq开始到下个endif为止所有行都删除的办法

虽然可以直接改TEST,但是留着那砣东西太碍眼了
本人在此论坛仅负责吐槽,问题急需解决请支付宝转账5毛至{我的[email protected]},将会竭诚为您服务

linux常见多媒体问题处理指南

1. 视频播放有问题->卸载gstreamer
2. 音频播放有问题->卸载pulseaudio
3. 远程播放有问题->卸载avahi
4. 系统全都有问题->卸载systemd,远离Lennart这傻逼让你从此轻松自在

⇩自由网络⇩
https://github.com/nyfair/freeweb
头像
josephyoung
帖子: 158
注册时间: 2011-11-05 18:53
来自: 南极圈

Re: 求助:文本文件匹配删除

#2

帖子 josephyoung » 2012-02-08 22:23

代码: 全选

awk '/ ?ifneq ?\(/{while($0 !~ /endif/)getline;getline}1'
头像
josephyoung
帖子: 158
注册时间: 2011-11-05 18:53
来自: 南极圈

Re: 求助:文本文件匹配删除

#3

帖子 josephyoung » 2012-02-08 22:27

如果有嵌套的,就麻烦一点

:em01 有嵌套的也搞出来了

代码: 全选

awk '/ ?ifneq ?\(/{T=0;while($0 !~ /endif/ || T!=1){if($0 ~ /endif/)T--;if($0 ~ / ?ifneq ?\(/)T++;getline;}getline}1'
上次由 josephyoung 在 2012-02-08 22:53,总共编辑 1 次。
头像
nyfair
帖子: 1067
注册时间: 2007-12-07 12:49
系统: winnux10
来自: Tree New Bee

Re: 求助:文本文件匹配删除

#4

帖子 nyfair » 2012-02-08 22:28

嗯,没有嵌套的
非常感谢
本人在此论坛仅负责吐槽,问题急需解决请支付宝转账5毛至{我的[email protected]},将会竭诚为您服务

linux常见多媒体问题处理指南

1. 视频播放有问题->卸载gstreamer
2. 音频播放有问题->卸载pulseaudio
3. 远程播放有问题->卸载avahi
4. 系统全都有问题->卸载systemd,远离Lennart这傻逼让你从此轻松自在

⇩自由网络⇩
https://github.com/nyfair/freeweb
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 求助:文本文件匹配删除

#5

帖子 fnan » 2012-02-09 5:57

sed '/^ifneq (/,/^endif$/d'
#加上 -i 就直接改文本。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
tusooa
帖子: 6548
注册时间: 2008-10-31 22:12
系统: 践兔
联系:

Re: 求助:文本文件匹配删除

#6

帖子 tusooa » 2012-02-12 19:01

这貌似不能处理嵌套的吧。

代码: 全选

] ls -ld //
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 求助:文本文件匹配删除

#7

帖子 eexpress » 2012-02-12 19:03

这要求简单,sed awk基本够了。
● 鸣学
头像
josephyoung
帖子: 158
注册时间: 2011-11-05 18:53
来自: 南极圈

Re: 求助:文本文件匹配删除

#8

帖子 josephyoung » 2012-02-12 19:09

tusooa 写了:这貌似不能处理嵌套的吧。
我3楼的那个代码可以处理嵌套的
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 求助:文本文件匹配删除

#9

帖子 fnan » 2012-02-12 20:44

josephyoung 写了:
tusooa 写了:这貌似不能处理嵌套的吧。
我3楼的那个代码可以处理嵌套的
kose-1@kose-1-desktop:~$ cat file
ifneq ($(TEST) 1)
...
...
...
endif
kose-1@kose-1-desktop:~$ awk '/ ?ifneq ?\(/{while($0 !~ /endif/)getline;getline}1' file
endif
#先改改bug。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 求助:文本文件匹配删除

#10

帖子 fnan » 2012-02-13 8:39

kose-1@kose-1-desktop:~$ cat file
..."1*ifneq"...
ifneq ($(TEST) 1)
..."ifneq"...
ifneq ($(TEST) 1)
...
..."endif"...
endif
..."endif"...
endif
..."2*endif"...
..."3*ifneq"...
ifneq ($(TEST) 1)
..."ifneq"...
ifneq ($(TEST) 1)
...
..."endif"...
ifneq ($(TEST) 1)
...
..."endif"...
endif
ifneq ($(TEST) 1)
...
..."endif"...
endif
endif
..."endif"...
endif
..."4*endif"...
kose-1@kose-1-desktop:~$ sed -nr '1h;2,$H;${x;s/(^|\n)ifneq \([^\n]*/\x1a/g;s/\nendif(\n|$)/\x1b\1/g;s/(\x1a[^\x1b]+)+(\x1b[^\x1a]+)*\x1b//g;p}' file
..."1*ifneq"...
..."2*endif"...
..."3*ifneq"...
..."4*endif"...
#用sed玩嵌套(不考虑tab)
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
头像
josephyoung
帖子: 158
注册时间: 2011-11-05 18:53
来自: 南极圈

Re: 求助:文本文件匹配删除

#11

帖子 josephyoung » 2012-02-13 20:20

fnan 写了:
josephyoung 写了:
tusooa 写了:这貌似不能处理嵌套的吧。
我3楼的那个代码可以处理嵌套的
kose-1@kose-1-desktop:~$ cat file
ifneq ($(TEST) 1)
...
...
...
endif
kose-1@kose-1-desktop:~$ awk '/ ?ifneq ?\(/{while($0 !~ /endif/)getline;getline}1' file
endif
#先改改bug。
谢谢指正

代码: 全选

awk '/ ?ifneq ?\(/{T=0;while($0 !~ /endif/ || T!=1){if($0 ~ /endif/)T--;if($0 ~ / ?ifneq ?\(/)T++;getline;}next}1' file
将最后的getline改为next应该没问题了
头像
josephyoung
帖子: 158
注册时间: 2011-11-05 18:53
来自: 南极圈

Re: 求助:文本文件匹配删除

#12

帖子 josephyoung » 2012-02-13 21:11

fnan 写了:sed -nr '1h;2,$H;${x;s/(^|\n)ifneq \([^\n]*/\x1a/g;s/\nendif(\n|$)/\x1b\1/g;s/(\x1a[^\x1b]+)+(\x1b[^\x1a]+)*\x1b//g;p}' file
#用sed玩嵌套(不考虑tab)
帅呆了 :em50 特别是这个正则/(\x1a[^\x1b]+)+(\x1b[^\x1a]+)*\x1b/,学习了
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: 求助:文本文件匹配删除

#13

帖子 fanhe » 2012-02-13 22:51

不喜欢shell了,脚本现在都直接写 python
头像
josephyoung
帖子: 158
注册时间: 2011-11-05 18:53
来自: 南极圈

Re: 求助:文本文件匹配删除

#14

帖子 josephyoung » 2012-02-13 23:50

fanhe 写了:不喜欢shell了,脚本现在都直接写 python
:em01 这个问题,带嵌套的,能写个python玩玩么?我也在学python中
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 求助:文本文件匹配删除

#15

帖子 fnan » 2012-02-15 21:22

josephyoung 写了:
fnan 写了:sed -nr '1h;2,$H;${x;s/(^|\n)ifneq \([^\n]*/\x1a/g;s/\nendif(\n|$)/\x1b\1/g;s/(\x1a[^\x1b]+)+(\x1b[^\x1a]+)*\x1b//g;p}' file
#用sed玩嵌套(不考虑tab)
帅呆了 :em50 特别是这个正则/(\x1a[^\x1b]+)+(\x1b[^\x1a]+)*\x1b/,学习了
#嵌套再加复杂一点就显出bug了,还是老老实实用循环可靠,效率低一些。
kose3@kose3-desktop:~$ cat file2
..."1*ifneq"...
ifneq ($(TEST) 1)
..."ifneq"...
ifneq ($(TEST) 1)
...
..."endif"...
endif
..."endif"...
endif
..."2*endif"...
..."3*ifneq"...
ifneq ($(TEST) 1)
..."ifneq"...
ifneq ($(TEST) 1)
...
..."endif"...
ifneq ($(TEST) 1)
...
..."endif"...
endif
..."xxx"...
ifneq ($(TEST) 1)
...
..."endif"...
endif
endif
..."endif"...
endif
..."4*endif"...
kose3@kose3-desktop:~$ sed -nr '1h;2,$H;${x;s/(^|\n)ifneq \([^\n]*/\x1a/g;s/\nendif/\x1b/g; :A;s/\x1a[^\x1b\x1a]+\x1b//g;tA;p}' file2
..."1*ifneq"...
..."2*endif"...
..."3*ifneq"...
..."4*endif"...
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
回复