当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 11 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 删除文件中的匹配行及其附近的行
帖子发表于 : 2011-01-09 23:54 
头像

注册: 2009-04-11 23:46
帖子: 4141
系统: Arch Linux
送出感谢: 11
接收感谢: 125
我有一个(很大的)文件,现需要删除其中匹配 pattern 的行以及其前后各一行,如何操作?

又,我只需要删除第一次匹配 pattern 的行以及其前后各一行,又该如何做?

PS: grep 的 -C 和 -v 同时使用不行。。。


_________________
我的博客 https://blog.lilydjwg.me/
提问的智慧
Arch Linux 中文论坛

我的vimrc: https://git.io/vimrc


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 删除文件中的匹配行及其附近的行
帖子发表于 : 2011-01-10 0:48 
头像

注册: 2008-09-18 13:11
帖子: 2797
送出感谢: 1
接收感谢: 458
如果不想逐行分析处理的话,用sed的=取得行号,再用d删除那三行


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 删除文件中的匹配行及其附近的行
帖子发表于 : 2011-01-10 12:44 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 274
-C 和 -v 同时使用不行
oops 才发现。


_________________
● 鸣学


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 删除文件中的匹配行及其附近的行
帖子发表于 : 2011-01-10 18:24 
头像

注册: 2007-11-20 10:58
帖子: 137
地址: Hangzhou, China
送出感谢: 0 次
接收感谢: 0 次
代码:
#!/bin/bash

if [ "$1" == "-g" ]; then
    GLOBAL=1
    shift
fi

pat=$1
fname=$2

for i in $(sed -n -e "/$pat/=" $fname); do
    start=$(expr $i - 1)
    if [ -z $cmd ]; then
        cmd="$start,+2d"
        [ "$GLOBAL" != "1" ] && break
    else
        cmd="$cmd;$start,+2d"
    fi
done

sed -e "$cmd" $fname


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 删除文件中的匹配行及其附近的行
帖子发表于 : 2011-01-10 19:14 
头像

注册: 2008-09-18 13:11
帖子: 2797
送出感谢: 1
接收感谢: 458
ls的没考虑连续两行都匹配pattern的情况


最后由 astolia 编辑于 2011-01-10 19:19,总共编辑了 2 次

页首
 用户资料  
 
6 楼 
 文章标题 : Re: 删除文件中的匹配行及其附近的行
帖子发表于 : 2011-01-10 19:18 
头像

注册: 2007-11-20 10:58
帖子: 137
地址: Hangzhou, China
送出感谢: 0 次
接收感谢: 0 次
astolia 写道:
ls的没考虑连续两行都匹配pattern的情况

:em06 好像是的


页首
 用户资料  
 
7 楼 
 文章标题 : Re: 删除文件中的匹配行及其附近的行
帖子发表于 : 2011-01-10 21:27 
头像

注册: 2009-04-11 23:46
帖子: 4141
系统: Arch Linux
送出感谢: 11
接收感谢: 125
realfiona 写道:
[bash]
#!/bin/bash

if [ "$1" == "-g" ]; then
GLOBAL=1
shift
fi

pat=$1
fname=$2

for i in $(sed -n -e "/$pat/=" $fname); do
start=$(expr $i - 1)
if [ -z $cmd ]; then
cmd="$start,+2d"
[ "$GLOBAL" != "1" ] && break
else
cmd="$cmd;$start,+2d"
fi
done

sed -e "$cmd" $fname
[/bash]


学习了。以后去 prince 生成的图标不需要等 Vim 慢慢打开它再慢慢地保存了 :-)

PS: bash 脚本还是高亮起来比较好看~


_________________
我的博客 https://blog.lilydjwg.me/
提问的智慧
Arch Linux 中文论坛

我的vimrc: https://git.io/vimrc


页首
 用户资料  
 
8 楼 
 文章标题 : Re: 删除文件中的匹配行及其附近的行
帖子发表于 : 2011-01-10 22:07 
头像

注册: 2007-11-20 10:58
帖子: 137
地址: Hangzhou, China
送出感谢: 0 次
接收感谢: 0 次
astolia 写道:
ls的没考虑连续两行都匹配pattern的情况

[bash]
#!/bin/bash

if [ "$1" == "-g" ]; then
GLOBAL=1
shift
fi

pat=$1
fname=$2

start=0
for i in $(sed -n -e "/$pat/=" $fname); do
beg=$(expr $i - 1)
end=$(expr $i + 1)

if [ -z $cmd ]; then
cmd="${beg},${end}d"
[ "$GLOBAL" != "1" ] && break
else
cmd="${cmd};${beg},${end}d"
fi
done

echo $cmd
sed -e "$cmd" $fname
[/bash]

奇怪,直接用行号好像就没问题,不知道和+N那种写法有什么区别


页首
 用户资料  
 
9 楼 
 文章标题 : Re: 删除文件中的匹配行及其附近的行
帖子发表于 : 2011-02-15 23:36 

注册: 2007-07-01 17:36
帖子: 229
地址: (En):address
系统: (En):System
送出感谢: 2
接收感谢: 3
这个问题如果这样解决可行么?
假设文件叫sample.txt
假设LZ要的pattern是 "foo"


代码:
grep -B1 -A1 "foo" sample.txt|grep -v -f - sample.txt

或者

grep -B1 -A1 "foo" sample.txt|comm -13 - sample.txt


_________________
---
regards,

Kent


页首
 用户资料  
 
10 楼 
 文章标题 : Re: 删除文件中的匹配行及其附近的行
帖子发表于 : 2011-02-19 20:04 
头像

注册: 2009-04-11 23:46
帖子: 4141
系统: Arch Linux
送出感谢: 11
接收感谢: 125
sk1418 写道:
这个问题如果这样解决可行么?
假设文件叫sample.txt
假设LZ要的pattern是 "foo"


代码:
grep -B1 -A1 "foo" sample.txt|grep -v -f - sample.txt

或者

grep -B1 -A1 "foo" sample.txt|comm -13 - sample.txt


你这样可行是可行,不过效率不高啊,关键是得生成新文件。


_________________
我的博客 https://blog.lilydjwg.me/
提问的智慧
Arch Linux 中文论坛

我的vimrc: https://git.io/vimrc


页首
 用户资料  
 
11 楼 
 文章标题 : Re: 删除文件中的匹配行及其附近的行
帖子发表于 : 2011-02-20 6:29 

注册: 2007-07-01 17:36
帖子: 229
地址: (En):address
系统: (En):System
送出感谢: 2
接收感谢: 3
再来个sed的,不生成文件的。

代码:
ArchT60::/tmp
kent$ cat sample.txt                                                  [ 23:19 ]
xxxx x xxx x x
xxx xx foo xx
xxxyy foo xx
ffd yyyy
zzz foo zzaz
bbb zzz xxx
==xxxxxxxxxx
xxxxxxxxxx
xxxfoo yyyyz
bolablablabla
==me too

如果pattern是foo
这个文件最终结果是就剩两行等号开头的吧?

kent$  sed -nr '/foo/!{h;N;/foo/D;};p' sample.txt |sed -nr '/foo/{n;/foo/!d;};p'|sed -nr '/foo/d;p'
==xxxxxxxxxx
==me too


要是不想用管道,也可以这样

代码:
ArchT60::/tmp
kent$  sed -ir '/foo/!{h;N;/foo/D;}' sample.txt                       [ 23:27 ]
ArchT60::/tmp
kent$ sed -ir '/foo/{n;/foo/!d;}' sample.txt                          [ 23:27 ]
ArchT60::/tmp
kent$ sed -ir '/foo/d' sample.txt                                     [ 23:28 ]
ArchT60::/tmp
kent$ cat sample.txt                                                  [ 23:28 ]
==xxxxxxxxxx
==me too


_________________
---
regards,

Kent


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 11 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译