是这样的,我想用 sed 删除匹配到的行的指定范围行,比如 sed -i '/rows/d' data 是删除所有匹配到的包含 rows 字符串的行,但是在这些匹配行中,我想保留第一行,删除第 2 行到最后一行,有人知道怎么做吗?先谢谢了^ ^
sed -i '/rows/q'
你这样只是保留了第一个 rows 匹配行以上的内容,以下的内容全被删除了。。。
perl -ne 'if ($.>=2) {print unless /rows/} else {print}'
我只是想对匹配到的行做修改,不动文件里的其他行
perl ?我想用 sed 实现><
补充一点,是影响匹配到的行,文件中的其他行不能动><
为啥不用 perl ,有 sed 的地方就有 perl
但是你这样把所有的包含 rows 字符串的行都删除了,我想保留第一个包含 rows 字符串的行
perl -e '$n=0; while(<>) {print if ($_ =~ /b/ && !($n++))}
上面写错= =, perl -e '$n=0; while(<>) {print if (!($_=~/rows/) || !($n++))}'
有个思路,可以先去替换第一行的 rows 到某个特殊的内容(只找第一个),然后再去删除包含 rows 的所有行,最后再把第一行的那个特殊关键字替换回 rows 。
那个 rows 的匹配串在哪改呀~~
$.是第几行的意思啊
非常感谢你,你解决了我的问题^ ^
再打扰一下,如果要保留最后一行的呢?
试试 tac|perl .....|tac 行吗
tac|perl -e '$n=0; while(<>) {print if (!($_=~/rows/) || !($n++))}' data|tac > test
这样吗?会卡住
perl -e '@x = <>; print $x[0];for (@x[1..$unless /rows/ };print $x[$#x]}
你这个直接在命令后面加目标文件不行啊><
把你那最后缺少的'补上也报错 syntax error at -e line 1, near "]}"
哦,最后一花括号去掉换成单引号
嗯,试了,但是所有的 rows 行都没有了>< 不是预期的效果
怎么可能, print $x[0] print $x[$是分别打印第一和最后一行
可是我重定向到文件里所受 rows 关键字搜索不到啊。。
其掉 for 那段执行能得到第一和最后行吗?
能,得到的是文件里的第一行和最后一行
第一行放暂存器,然后取出来,一行可以有多个 sed 命令,命令用 ; 分割
我觉得你可能理解错了,我的包含 rows 串的行不在文件的第一行和最后一行的
sed '2,$s/aaa/bbb/g' text
你也理解错了,我的匹配行不在文件的第一行的
看错了,以为你是要从第二行开始替换,结果你是删除
sed -i '0,/rows/{//d}'
_rep() {
text=`sed -n '/$1/p' $2 | head -1`
n=`sed -n '/$1/=' $2 | head -1`
sed -i '/$1/d' $2 && sed -i "${n}i $text" $2
}
_rep match a.txt
鉴于楼主必须使用 sed ,可以先找出第一次匹配的内容和行号,然后删除后再把这一行给添加在之前的位置
ps : osx 的 sed 和 linux 的差别很大!!!
看到楼上都没有正确回答,闪开我要装逼了!
sed '1,/rows/!{/rows/d}'
啊 32 楼已经给出来了……
逃
可是楼主要的是保留第一次匹配的行,不是第一行
不好意思,题目没看清 perl -e '@x=<>;@i = grep { $x[$_]=~/rows/ } 0..$for (1..$@x'
请自行测试
我错了,你这确实是对的, good job
僅限 GNU sed 。
--posix 没有问题。
你们两个的都可以, lululau 的加个!符号就行了,但是如果要保留的是最后一行呢?要怎么办?
你这个会保留第一个和最后一个,怎么修改使得之保留第一个或最后一个呢?
perl -e '@x=<>;@i = grep { $x[$_]=~/rows/ } 0..$for (1..$@x'
^----------改成$就把最后一个干掉了
^----------改成 0 就把第一个干掉了
perl -e '@x=<>;@i = grep { $x[$_]=~/rows/ } 0..$for (1..$@x'
^----------改成$就把最后一个干掉了
^----------改成 0 就把第一个干掉了
awk '!/rows/{print} /rows/{if(a != 1){print;a=1}}'
求解释 !{//d} 这部分语法
要合在一起理解, 1 ,/rows/! 表示 1 ,/rows/之外的行,{/rows/d}表示删除包含 rows 的行…
偷个巧,保留最后一个可以这样 tac file | sed '1,/rows/!{/rows/d}' | tac
保留最后一行稍微换一下就好了啊
sed '/rows/,$!{/rows/d}'
这个用来保留最后一个是不对的,你再看看…