技术解析

大家好,我有一个关于 sed 命令的问题想问大家^ ^
0
2021-07-05 04:44:29
idczone

是这样的,我想用 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}'

这个用来保留最后一个是不对的,你再看看…
数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服