删除文件中的匹配行及其附近的行
- lilydjwg
- 论坛版主
- 帖子: 4258
- 注册时间: 2009-04-11 23:46
- 系统: Arch Linux
- 联系:
删除文件中的匹配行及其附近的行
我有一个(很大的)文件,现需要删除其中匹配 pattern 的行以及其前后各一行,如何操作?
又,我只需要删除第一次匹配 pattern 的行以及其前后各一行,又该如何做?
PS: grep 的 -C 和 -v 同时使用不行。。。
又,我只需要删除第一次匹配 pattern 的行以及其前后各一行,又该如何做?
PS: grep 的 -C 和 -v 同时使用不行。。。
- astolia
- 论坛版主
- 帖子: 6703
- 注册时间: 2008-09-18 13:11
Re: 删除文件中的匹配行及其附近的行
如果不想逐行分析处理的话,用sed的=取得行号,再用d删除那三行
- eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
- realfiona
- 帖子: 137
- 注册时间: 2007-11-20 10:58
- 来自: Hangzhou, China
- 联系:
Re: 删除文件中的匹配行及其附近的行
代码: 全选
#!/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
- astolia
- 论坛版主
- 帖子: 6703
- 注册时间: 2008-09-18 13:11
- realfiona
- 帖子: 137
- 注册时间: 2007-11-20 10:58
- 来自: Hangzhou, China
- 联系:
Re: 删除文件中的匹配行及其附近的行
astolia 写了:ls的没考虑连续两行都匹配pattern的情况

- lilydjwg
- 论坛版主
- 帖子: 4258
- 注册时间: 2009-04-11 23:46
- 系统: Arch Linux
- 联系:
Re: 删除文件中的匹配行及其附近的行
学习了。以后去 prince 生成的图标不需要等 Vim 慢慢打开它再慢慢地保存了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]

PS: bash 脚本还是高亮起来比较好看~
- realfiona
- 帖子: 137
- 注册时间: 2007-11-20 10:58
- 来自: Hangzhou, China
- 联系:
Re: 删除文件中的匹配行及其附近的行
[bash]astolia 写了:ls的没考虑连续两行都匹配pattern的情况
#!/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那种写法有什么区别
-
- 帖子: 229
- 注册时间: 2007-07-01 17:36
- 系统: (En):System
- 来自: (En):address
- 联系:
Re: 删除文件中的匹配行及其附近的行
这个问题如果这样解决可行么?
假设文件叫sample.txt
假设LZ要的pattern是 "foo"
假设文件叫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
regards,
Kent
- lilydjwg
- 论坛版主
- 帖子: 4258
- 注册时间: 2009-04-11 23:46
- 系统: Arch Linux
- 联系:
Re: 删除文件中的匹配行及其附近的行
你这样可行是可行,不过效率不高啊,关键是得生成新文件。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
-
- 帖子: 229
- 注册时间: 2007-07-01 17:36
- 系统: (En):System
- 来自: (En):address
- 联系:
Re: 删除文件中的匹配行及其附近的行
再来个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
regards,
Kent