我想从文件中删除一个或多个特定的行号。如何使用sed做到这一点?
如果你想删除第5到第10行和第12行:
sed -e '5,10d;12d' file
这将把结果打印到屏幕上。如果你想把结果保存到同一个文件:
sed -i.bak -e '5,10d;12d' file
这将把未修改的文件存储为file.bak,并删除给定的行。
file.bak
注意:行号从1开始。文件的第一行是1,而不是0。
$ cat foo 1 2 3 4 5 $ sed -e '2d;4d' foo 1 3 5 $
还有awk
awk 'NR!~/^(5|10|25)$/' file
我想提出一个关于awk的概括。
当文件由固定大小的块组成时 要删除的行对于每个块都是重复的, Awk可以很好地以这种方式工作
awk '{nl=((NR-1)%2000)+1; if ( (nl<714) || ((nl>1025)&&(nl<1029)) ) print $0}' OriginFile.dat > MyOutputCuttedFile.dat
在这个例子中,块的大小是2000,我想打印行[1..713]和[1026. 1029]。
NR
%
||
&&
print $0
Why ((NR-1)%BLOCKSIZE)+1: (NR-1) We need a shift of one because 1%3=1, 2%3=2, but 3%3=0. +1 We add again 1 because we want to restore the desired order. +-----+------+----------+------------+ | NR | NR%3 | (NR-1)%3 | (NR-1)%3+1 | +-----+------+----------+------------+ | 1 | 1 | 0 | 1 | | 2 | 2 | 1 | 2 | | 3 | 0 | 2 | 3 | | 4 | 1 | 0 | 1 | +-----+------+----------+------------+
您可以删除特定的单行及其行号
sed -i '33d' file
这将删除33行号上的行并保存更新后的文件。
这通常是反模式的症状。生成行号的工具很可能被立即删除行的工具所取代。例如;
grep -nh error logfile | cut -d: -f1 | deletelines logfile
(其中deletelines是你想象你需要的实用程序)与
deletelines
grep -v error logfile
话虽如此,如果你真的需要执行这个任务,你可以从行号文件生成一个简单的sed脚本。你可以用sed幽默地(但可能有点令人困惑)做到这一点。
sed
sed 's%$%d%' linenumbers
它接受一个包含行号的文件,每行一个,并在标准输出中产生相同的行号,每个行号后面附加d。这是一个有效的sed脚本,我们可以将其保存到一个文件中,或者(在某些平台上)管道到另一个sed实例:
d
sed 's%$%d%' linenumbers | sed -f - logfile
在某些平台上,sed -f不理解选项参数-表示标准输入,所以你必须将脚本重定向到一个临时文件,并在完成时清理它,或者如果你的操作系统(或shell)有的话,可以用/dev/stdin或/proc/$pid/fd/1替换唯一的破号。
sed -f
-
/dev/stdin
/proc/$pid/fd/1
和往常一样,你可以在-f选项之前添加-i,让sed编辑目标文件,而不是在标准输出中产生结果。在*BSDish平台(包括OSX)上,你需要为-i提供一个显式参数;一个常见的习语是提供一个空的参数;-i ''。
-f
-i
-i ''
sed -i '1d' file
正如Brian声明在这里, <address><command>被使用,<address>是<1>和<command> <d>。
<address><command>
<address>
<1>
<command>
<d>
cat -b /etc/passwd | sed -E 's/^( )+(<line_number>)(\t)(.*)/--removed---/g;s/^( )+([0-9]+)(\t)//g'
cat -b→打印带有数字的行
cat -b
s/^( )+(<line_number>)(\t)(.*)//g→将行号替换为空(删除行)
s/^( )+(<line_number>)(\t)(.*)//g
s/^( )+([0-9]+)(\t)//g #删除cat打印的数字
s/^( )+([0-9]+)(\t)//g
cat