我想从文件中删除一个或多个特定的行号。我将如何使用 sed 执行此操作?
如果要删除第 5 到 10 行和第 12 行:
sed -e '5,10d;12d' file
这会将结果打印到屏幕上。如果要将结果保存到同一文件:
sed -i.bak -e '5,10d;12d' file
这会将未修改的文件存储为 file.bak
,并删除给定的行。
注意:行号从 1 开始。文件的第一行是 1,而不是 0。
您可以通过以下方式删除特定的单行及其行号
sed -i '33d' file
这将删除第 33 行号上的行并保存更新的文件。
sed -i '0,/<TARGET>/{/<NEW_VALUE>/d;}' '<SOME_FILE_NAME>'
。谢谢!
sed
比 head
和 tail
的简单组合慢一个数量级:这是一个更快的方法示例(没有就地模式):delete-line() { local filename="$1"; local lineNum="$2"; head -n $((lineNum-1)) "$filename"; tail +$((lineNum+1)) "$filename"; }
还有 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
是您想象需要的实用程序)与
grep -v error logfile
话虽如此,如果您确实需要执行此任务,则可以从行号文件生成一个简单的 sed
脚本。幽默地(但可能有点令人困惑)您可以使用 sed
做到这一点。
sed 's%$%d%' linenumbers
这接受一个行号文件,每行一个,并在标准输出中生成相同的行号,每个行号后面附加 d
。这是一个有效的 sed
脚本,我们可以将其保存到文件中,或者(在某些平台上)通过管道传输到另一个 sed
实例:
sed 's%$%d%' linenumbers | sed -f - logfile
在某些平台上,sed -f
不理解选项参数 -
表示标准输入,因此您必须将脚本重定向到一个临时文件,并在完成后清理它,或者可能将单独的破折号替换为 { 3} 或 /proc/$pid/fd/1
如果您的操作系统(或外壳)有它。
与往常一样,您可以在 -f
选项之前添加 -i
以使 sed
编辑目标文件,而不是在标准输出中生成结果。在 *BSDish 平台(包括 OSX)上,您还需要为 -i
提供显式参数;一个常见的习惯用法是提供一个空参数; -i ''
。
p
而不是 d
,以及选项 -n
(没有 -n
和 {5 } 也不起作用)。
我想用 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 用来存储当前行号的变量。
% 给出两个整数相除的余数(或模数);
nl=((NR-1)%BLOCKSIZE)+1 这里我们在变量 nl 中写入当前块内的行号。 (见下文)
||和 && 是逻辑运算符 OR 和 AND。
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中的第一行
sed -i '1d' file
正如 Brian 所说的 here,使用了 <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
->打印带数字的行
s/^( )+(<line_number>)(\t)(.*)//g
->将行号替换为空(删除行)
s/^( )+([0-9]+)(\t)//g
#remove cat
打印的数字
不定期副业成功案例分享
sed -e '5,$d' file
sed -e '5d' file
。语法是<address><command>
;其中<address>
可以是像5
这样的单行,也可以是像5,10
这样的一系列行,命令d
删除给定的一行或多行。地址也可以是正则表达式,或指示文件最后一行的美元符号$
。