大家好,我有一个关于 sed 命令的问题想问大家^ ^

2016-01-11 19:42:49 +08:00
 ficenow

是这样的,我想用 sed 删除匹配到的行的指定范围行,比如 sed -i '/rows/d' data 是删除所有匹配到的包含 rows 字符串的行,但是在这些匹配行中,我想保留第一行,删除第 2 行到最后一行,有人知道怎么做吗?先谢谢了^ ^

4023 次点击
所在节点    Linux
52 条回复
rrfeng
2016-01-11 23:26:44 +08:00
@Elethom
--posix 没有问题。
ficenow
2016-01-12 15:18:51 +08:00
@lululau
@rrfeng 你们两个的都可以, lululau 的加个!符号就行了,但是如果要保留的是最后一行呢?要怎么办?
ficenow
2016-01-12 15:25:41 +08:00
@xuboying 你这个会保留第一个和最后一个,怎么修改使得之保留第一个或最后一个呢?
xuboying
2016-01-12 15:36:52 +08:00
perl -e '@x=<>;@i = grep { $x[$_]=~/rows/ } 0..$#x;$x[$i[$_]]="" for (1..$#i-1);print @x'
^----------改成$#i 就把最后一个干掉了
^----------改成 0 就把第一个干掉了
xuboying
2016-01-12 15:37:31 +08:00
@ficenow
perl -e '@x=<>;@i = grep { $x[$_]=~/rows/ } 0..$#x;$x[$i[$_]]="" for (1..$#i-1);print @x'
                                   ^----------改成$#i 就把最后一个干掉了
                                 ^----------改成 0 就把第一个干掉了
yingluck
2016-01-12 17:03:54 +08:00
awk '!/rows/{print} /rows/{if(a != 1){print;a=1}}'
tt0411
2016-01-12 19:04:22 +08:00
@rrfeng 求解释 !{//d} 这部分语法
lonelinsky
2016-01-12 19:39:52 +08:00
@tt0411 要合在一起理解, 1 ,/rows/! 表示 1 ,/rows/之外的行,{/rows/d}表示删除包含 rows 的行…

@ficenow 偷个巧,保留最后一个可以这样 tac file | sed '1,/rows/!{/rows/d}' | tac
rrfeng
2016-01-12 22:53:16 +08:00
保留最后一行稍微换一下就好了啊
sed '/rows/,$!{/rows/d}'
lonelinsky
2016-01-13 02:11:00 +08:00
@rrfeng 这个用来保留最后一个是不对的,你再看看…😂
ficenow
2016-01-13 18:18:07 +08:00
@lonelinsky
@rrfeng rrfeng 那样不能保留最后一行, lonelinsky 的偷巧方法可以,但是 tac 命令处理文件的时候会把我文件的有些行合并(我也不知道怎么回事),所以把 tac 命令改为 sed '1!G;h;$!d'或 sed -n '1!G;h;$p'是可以的,但是处理速度不理想~~
lonelinsky
2016-01-14 09:52:28 +08:00
@ficenow 还可以试试这样 sed "`grep -n rows file | tail -1 | cut -d: -f1`! {/rows/d}" file

至于 tac 会合并的问题我这边没碰到,你试下把会合并的行摘出来看看? 或者用 vim -b 之类看下是不是不换行的地方有问题…

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/249964

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX