2013-07-05 34 views
4

我想遍历文件并删除某些行。示例文件:在文件中循环并删除某些行

的test.txt

a 
b 
c 
d 

我有什么:

FILE=/tmp/test.txt 
while read FILE 
do 
    # if the line starts with b delete it otherwise leave it there 
    ? 
done 
+0

'read'从标准输入中读取一行,而不是从文件中读取您期望的代码。你应该重定向'stdin'从文件中获取一行,请参阅:Duffy的答案。但是这个任务'sed'或'grep'更快。 – jm666

+0

@ jm666较大文件较快,但不适用于较短文件。 'fork()'/'exec()'相比于只使用shell内建函数的东西是一个很大的开销。 –

+0

@CharlesDuffy你是对的。在80线以下的笔记本中,bash速度更快。 80以上的sed速度更快,超过300行grep速度也更快。 :)取决于,你叫什么“大文件”:) – jm666

回答

8

这是sed一份工作 - 在UNIX流编辑器:

(sed '/^b/d' yourfile > yourfile~ && mv yourfile~ yourfile) || rm yourfile~ 

的命令将删除所有以开头的行210并将剩余行写入备份文件。如果成功,备份文件将被重命名为原始文件,如果失败备份文件将被删除。

+0

是啊实际上与sed更容易做到 – DRC

+0

@DRC只有当你使用非POSIX功能; sed的'-i'标志是非标准的,并且在所有实现中可能不存在。如果你想要一个能够进行就地操作的标准化编辑器,你可以使用'ex'或'ed',而不是'sed'。 –

+0

@CharlesDuffy如果你确实有一个不支持'-i'的版本,你可以使用:'sed'/^1/d'file2> file2_; mv file2_ file2' – hek2mgl

4

你可以用grep的oneliner做到这一点:

grep -v "^b" test.txt > newfile 
2

轻松使用bash完成内置功能:

while read -r; do 
    [[ $REPLY = b* ]] || printf '%s\n' "$REPLY" 
done <file >file.new 
mv file.new file 
0

“的Perl ......它可能是你$PATH”: - )

使用$SHELL的微小文字的任务(即shkshzshbashtcsh,csh)在BSD,OSX,Linux,AIX,Solaris上与各种“标准POSIX”相对于sed,grep和其他实用程序的BSD,Linux和GNU扩展,并注意考虑gawkawk和古代版本许多服务器系统上的工具......可能很难。

perl -i.orig -ne 'print unless /^b/' test.txt 

它工作吗?

diff test.txt test.txt.orig 
相关问题