我想从文件中删除一个或多个特定的行号 . 我怎么用sed这样做?
如果要删除第5行到第10行和第12行:
sed -e '5,10d;12d' file
这会将结果打印到屏幕上 . 如果要将结果保存到同一文件:
sed -i.bak -e '5,10d;12d' file
这会将文件备份到 file.bak ,并删除给定的行 .
file.bak
您可以通过 sed -i '33d' file 删除包含其行号的特定单行
这将删除33行号上的行并保存更新的文件 .
和awk一样
awk 'NR!~/^(5|10|25)$/' file
$ cat foo 1 2 3 4 5 $ sed -e '2d;4d' foo 1 3 5 $
这通常是反模式的症状 . 产生行号的工具很可能被替换为立即删除行的工具 . 例如;
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 不理解选项参数 - 表示标准输入,因此您必须将脚本重定向到临时文件,并在完成后将其清理,或者如果您将 /dev/stdin 或 /proc/$pid/fd/1 替换为单独的短划线 . 操作系统(或shell)有 .
sed -f
-
/dev/stdin
/proc/$pid/fd/1
与往常一样,您可以在 -f 选项之前添加 -i ,以便 sed 编辑目标文件,而不是在标准输出上生成结果 . 在* BSDish平台(包括OSX)上,您还需要为 -i 提供显式参数;一个常见的习语就是提供一个空洞的论点; -i '' .
-f
-i
-i ''
我想用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 是awk用于存储当前行号的变量 .
NR
% 给出两个整数除法的余数(或模数);
%
nl=((NR-1)%BLOCKSIZE)+1 这里我们在变量 nl 中写入当前块内的行号 . (见下文)
nl=((NR-1)%BLOCKSIZE)+1
|| 和 && 是逻辑运算符 OR 和 AND .
||
&&
print $0 写完整行
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 | +-----+------+----------+------------+
6 回答
如果要删除第5行到第10行和第12行:
这会将结果打印到屏幕上 . 如果要将结果保存到同一文件:
这会将文件备份到
file.bak
,并删除给定的行 .您可以通过 sed -i '33d' file 删除包含其行号的特定单行
这将删除33行号上的行并保存更新的文件 .
和awk一样
这通常是反模式的症状 . 产生行号的工具很可能被替换为立即删除行的工具 . 例如;
(其中
deletelines
是您想象中需要的实用程序)与之相同话虽如此,如果您确实需要执行此任务,可以从行号文件生成一个简单的
sed
脚本 . 幽默(但也许有点令人困惑)你可以用sed
做到这一点 .这接受一个行号文件,每行一个,并在标准输出上生成相同的行号,每行后附加
d
. 这是一个有效的sed
脚本,我们可以将其保存到文件中,或者(在某些平台上)管道到另一个sed
实例:在某些平台上,
sed -f
不理解选项参数-
表示标准输入,因此您必须将脚本重定向到临时文件,并在完成后将其清理,或者如果您将/dev/stdin
或/proc/$pid/fd/1
替换为单独的短划线 . 操作系统(或shell)有 .与往常一样,您可以在
-f
选项之前添加-i
,以便sed
编辑目标文件,而不是在标准输出上生成结果 . 在* BSDish平台(包括OSX)上,您还需要为-i
提供显式参数;一个常见的习语就是提供一个空洞的论点;-i ''
.我想用awk提出一个概括 .
当文件由固定大小的块构成并且每个块重复要删除的行时,awk可以这样工作正常
在这个例子中,块的大小是2000,我想打印行[1..713]和[1026..1029] .
NR
是awk用于存储当前行号的变量 .%
给出两个整数除法的余数(或模数);nl=((NR-1)%BLOCKSIZE)+1
这里我们在变量 nl 中写入当前块内的行号 . (见下文)||
和&&
是逻辑运算符 OR 和 AND .print $0
写完整行