Chinaunix

标题: 删除指定文件段 [打印本页]

作者: wangsir202    时间: 2004-03-03 12:04
标题: 删除指定文件段
我如果想查找指定字符之间的文件段,并且在这个文件段中如果包含某一字符串,则将此文件段删除。如何做呀???
比如
begin time 20040303
first zhang
second liu
end time
begin time 20040303
first wang
second zhu
end time

删除包含second liu 的所有begin time 到end time
作者: nkoldbug    时间: 2004-03-03 14:48
提示: 作者被禁止或删除 内容自动屏蔽
作者: labrun    时间: 2004-03-03 16:39
标题: 删除指定文件段
如果你的文件中有很多这样的begin---end的段,不确定那一段之间包含second liu 你可以参考
cat file | grep -n -E "(second|end|begin)" | grep -1 'second' | grep -v -E '(\-|
econd)' | cut -d: -f1  | sed -n '$!N;s/\n/,/p'
提取出所有包含scond 的段的起始和中止行号。
至于怎样再删除这些段。你再自己想办法吧。
作者: r2007    时间: 2004-03-03 17:51
标题: 删除指定文件段
试试这个^_^
  1. sed '/^begin time/{:a;N;/\nend time/bb;ba;:b;/\nsecond liu/d}' file
复制代码

作者: nkoldbug    时间: 2004-03-03 18:09
提示: 作者被禁止或删除 内容自动屏蔽
作者: wangsir202    时间: 2004-03-04 09:17
标题: 删除指定文件段
楼上的只能删除匹配模式的最后一行呀!
我根据nkoldbug的改了一下,ok了!!^_^
set file=$1
if ( -s 'log' ) then
        rm -rf log log1
endif
set first=1
foreach i (`sed -n '/^second liu/=' $file`)
set end = `expr $i - 3`
if ( $i - 2 != $first) then
        sed -n "$first,${end}p" $file >> log
endif
set first = `expr $i  + 2`
end
sed -n "$first,$$p" $file >> log
作者: labrun    时间: 2004-03-04 11:37
标题: 删除指定文件段
[quote]原帖由 "r2007"]sed '/^begin time/{:a;N;/\nend time/bb;ba;:b;/\nsecond liu/d}' file[/quote 发表:


老兄请讲讲 :a, bb, ba, :b是什么意思?
作者: r2007    时间: 2004-03-04 12:00
标题: 删除指定文件段
:a,:b类似basic语言中的标号。
bb,ba即goto 标号b,goto标号a。
我的表达不知是否清楚?
作者: labrun    时间: 2004-03-04 12:48
标题: 删除指定文件段
可我对你的逻辑还是没搞清楚。你的代码太厉害了。
如果不嫌麻烦的话可否详细解释一下这条语句执行的过程?
另外我好像见过sed中用:a;ta。这个ta是什么意思?
作者: r2007    时间: 2004-03-04 13:27
标题: 删除指定文件段
我的表达不太好,我将那一句写成一个脚本,并加了一些注释,希望对理解有所帮助。欢迎询问^_^
  1. /^begin time/ {
  2. :label1                 #set a label named label1
  3. N                       #read next line and append to pattern space
  4. /\nend time/b label2    #search for \nend time, if find then goto label2
  5. b label1                #otherwise goto label1, read next line and append
  6. :label2                 #set a label named label2
  7. /\nsecond liu/d         #if reach the end time string, then go here
  8.                         #and search \nsecond liu in the pattern space
  9.                         #if find, then delete it.
  10. }
复制代码

作者: bjgirl    时间: 2004-03-04 13:38
标题: 删除指定文件段
GG们,试试grep @_@

  1. $grep -B2 -A1 "second [^liu]" file
  2. begin time 20040303
  3. first wang
  4. second zhu
  5. end time
复制代码

欢迎测试
作者: wangsir202    时间: 2004-03-04 13:45
标题: 删除指定文件段
为什么我执行了之后报这样的错呢。
执行语句: sed    "/^begin time/{:a;N;/\nend time/bb;ba;:b;/\second liu/d}" time.txt
系统报错:sed: -e expression #1, char 55: Extra characters after command
是不是sed对系统有什么要求???
作者: labrun    时间: 2004-03-04 14:00
标题: 删除指定文件段
[quote]原帖由 "r2007"][/quote 发表:

看明白了,谢谢兄台。想不到还可以之样利用sed来进行逻辑控制。
兄台厉害
作者: labrun    时间: 2004-03-04 14:04
标题: 删除指定文件段
原帖由 "wangsir202" 发表:
为什么我执行了之后报这样的错呢。
执行语句: sed    "/^begin time/{:a;N;/\nend time/bb;ba;:b;/\second liu/d}" time.txt
系统报错:sed: -e expression #1, char 55: Extra characters after command
是不是..........

我没有环境,应该是可以的。要不你把双引号换成单引号试试。或加个-e选项
作者: bjgirl    时间: 2004-03-04 14:15
标题: 删除指定文件段
原帖由 "labrun" 发表:

看明白了,谢谢兄台。想不到还可以之样利用sed来进行逻辑控制。
兄台厉害
r2007,ad,netman都很厉害的说 是我学习的楷模!
作者: labrun    时间: 2004-03-04 14:23
标题: 删除指定文件段
bjgirl也很厉害,偶向你们学习。:)
作者: wangsir202    时间: 2004-03-04 15:41
标题: 删除指定文件段
[quote]原帖由 "r2007"][/quote 发表:



sed -e '/^begin time/{:a;N;/\nend time/bb;ba;:b;/\nsecond liu/d;}' file
原来只是d后面少了一个;(分号)呀!!!!^_^^_^
作者: r2007    时间: 2004-03-04 15:54
标题: 删除指定文件段
我的环境中,可以不要最后一个分号。
  1. r2007@www r2007 $ sed --version
  2. GNU sed version 4.0.7
  3. Copyright (C) 2003 Free Software Foundation, Inc.
  4. This is free software; see the source for copying conditions.  There is NO
  5. warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
  6. to the extent permitted by law.
  7. r2007@www r2007 $
复制代码

作者: nkoldbug    时间: 2004-03-04 15:56
提示: 作者被禁止或删除 内容自动屏蔽
作者: bjgirl    时间: 2004-03-04 16:15
标题: 删除指定文件段
原帖由 "nkoldbug" 发表:
hehe
俺就向bjgirl  JJ学习了!!!
客气啦....不过还是我的那段最简便
$grep -B2 -A1 "second [^liu]" file
begin time 20040303
first wang
second zhu
end time

作者: r2007    时间: 2004-03-04 16:24
标题: 删除指定文件段
我还有更简单的^_^
  1. r2007@www r2007 $ sed '1,4d' file
  2. begin time 20040303
  3. first wang
  4. second zhu
  5. end time
复制代码

作者: bjgirl    时间: 2004-03-04 16:37
标题: 删除指定文件段
[quote]原帖由 "r2007"][/quote 发表:


cat file
begin time 20040303
first wang
second zhu
end time
n time 20040303
first wang
second zhu
end time
begin time 20040303
first zhang
second liu
end time
begin time 20040303
first wang
second zhu
end time
begin time 20040303
first wang
second zhu
end time
begin time 20040303
first wang
second zhu
end time
begin time 20040303
first wang
second zhu
end time
try it ^_^
还是我的字母用的最少吧!
grep -B2 -A1 "second [^liu]" file
作者: r2007    时间: 2004-03-04 16:45
标题: 删除指定文件段
哈哈,擅自修改楼主的样本,我也改一下^_^
这段应该符合楼主的描述吧?MM那个恐怕失效了吧?
  1. r2007@www r2007 $ cat a
  2. begin time 20040303
  3. first wang
  4. second zhu
  5. end time
  6. begin time 20040303
  7. first first ha ha
  8. first zhang
  9. second liu
  10. third r2007
  11. last bjmm
  12. end time
  13. begin time 20040303
  14. first wang
  15. second zhu
  16. end time
  17. r2007@www r2007 $ sed '/^begin time/{:a;N;/\nend time/bb;ba;:b;/\nsecond liu/d}' a         
  18. begin time 20040303
  19. first wang
  20. second zhu
  21. end time
  22. begin time 20040303
  23. first wang
  24. second zhu
  25. end time
  26. r2007@www r2007 $

复制代码

作者: bjgirl    时间: 2004-03-04 17:08
标题: 删除指定文件段
就是比你强,看,原封不动,而且还自动加了分段符呢!
  1. cat file
  2. begin time 20040303
  3. first wang
  4. second zhu
  5. end time
  6. begin time 20040303
  7. first first ha ha
  8. first zhang
  9. second liu
  10. third r2007
  11. last bjmm
  12. end time
  13. begin time 20040303
  14. first wang
  15. second zhu
  16. end time
  17. grep -B2 -A1 "second [^liu]" file
  18. begin time 20040303
  19. first wang
  20. second zhu
  21. end time
  22. --
  23. begin time 20040303
  24. first wang
  25. second zhu
  26. end time
复制代码
你的行么?! xixi ^_^
作者: r2007    时间: 2004-03-04 17:37
标题: 删除指定文件段
败了。我加错地方了^_^
作者: bjgirl    时间: 2004-03-04 17:41
标题: 删除指定文件段
[quote]原帖由 "r2007"]败了。我加错地方了^_^[/quote 发表:

切,就知道欺负我!,不过很PF你的sed/awk编程能力的说
作者: nkoldbug    时间: 2004-03-04 17:57
提示: 作者被禁止或删除 内容自动屏蔽
作者: bjgirl    时间: 2004-03-04 18:28
标题: 删除指定文件段
原帖由 "nkoldbug" 发表:


你的在偶的系统里用不了
那是grep版本的问题
作者: nkoldbug    时间: 2004-03-04 20:16
提示: 作者被禁止或删除 内容自动屏蔽
作者: john_student    时间: 2004-03-04 20:41
标题: 删除指定文件段
r2007对sed的纯熟运用,哇。
PF!对你的敬仰之情有如滔滔江水。。。。。。
作者: yoof    时间: 2004-03-04 22:17
标题: 删除指定文件段
sed '/^begin time/{:a;N;/\nend time/bb;ba;:b;/\nsecond liu/d}' file

麻烦详细讲一下bb;ba跳转的过程

R版主
作者: nkoldbug    时间: 2004-03-05 10:02
提示: 作者被禁止或删除 内容自动屏蔽
作者: xswj77    时间: 2004-03-05 10:50
标题: 删除指定文件段
good!高手如云啊!
作者: bjgirl    时间: 2004-03-05 12:44
标题: 删除指定文件段
[quote]原帖由 "nkoldbug"][/quote 发表:

便于阅读嘛....
ps:r007出的题太难了呗,所以以不变应万变的说!
作者: yoof    时间: 2004-03-05 14:03
标题: 删除指定文件段
R版本还没回答我的问题捏?
作者: r2007    时间: 2004-03-05 21:14
标题: 删除指定文件段
[quote]原帖由 "yoof"]R版本还没回答我的问题捏?[/quote 发表:

我在代码上已经加上了注释,不知再如何解释^_^
还是先说说你对这个语句的初步理解吧,这样我再根据你的理解程度作出解释。
作者: labrun    时间: 2004-03-05 23:06
标题: 删除指定文件段
我来说一下吧,不对的话r2007指出。(其实就是把他的注释翻成汉语)
在以begin开头的行先作标记a,如果下一行不是end就一直执行N操作,直到遇到下一行是end则标记为b.这样在标记a和b之间如果有/second liu/则将该标记段删除。
作者: r2007    时间: 2004-03-05 23:30
标题: 删除指定文件段
  1. /^begin time/ {
  2. :label1                 #定义一个语句标号。
  3. N                       #读取文件的下一行,并《追加》到模式空间里。
  4. /\nend time/b label2    #在模式空间里判断是否有回车+"end time"字串,
  5.                         #如果没有则执行下一条语句,有则执行无条件转移指令"b lable2",既跳转到语句标号"label2‘处。
  6. b label1                #无条件go to label1,继续循环。
  7. :label2                 #定义一个语句标号"label2"。
  8. /\nsecond liu/d         #在模式空间里判断是否有回车+"second liu"字串,
  9.                         #如果有则清空模式空间,此时模式空间保存的从"begin time"
  10.                         #i到"end time"之间的所有行均被删除。
  11.                         #如果没有找到,则保留模式空间中的内容,所以其它没有包含"second liu"的段自动输出到标准设备,即屏幕上了。
  12. }
复制代码

作者: labrun    时间: 2004-03-05 23:36
标题: 删除指定文件段
还是r2007自己解释的更细些。:)
作者: bjgirl    时间: 2004-03-05 23:50
标题: 删除指定文件段
[quote]原帖由 "r2007"][/quote 发表:

佩服,




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2