0

我有一个文本文件,需要删除其中不包含http的所有行。或者,它可以将其中包含http的所有文件输出到新文件。

我的原始文件的名称是 list.txt,我需要生成一个名称类似于 new.txt 的新文件

我知道通过命令行有几种方法可以做到这一点,但我真正要寻找的是最快的方法,因为我需要用几个文件来做这件事,而且每个文件的大小都是几吉格......

4

3 回答 3

2
perl -i -lne 'print if(/http/)' your_file

如果文件中没有 http,则上述命令将从文件中删除所有行。如果您坚持保留原始文件备份,您可以无论如何提供“.bak”选项,如下所述:

perl -i.bak -lne 'print if(/http/)' your_file

通过这个 your_file.bak 将生成,它只是原始文件的副本,原始文件将根据您的需要进行修改。您也可以使用 awk:

awk '/http/' your_file

这将输出到控制台。无论如何,您都可以使用“>”将输出存储在新文件中。

于 2013-10-08T06:36:57.987 回答
2

最快、最短的解决方案,

fgrep -v "http"

当然,grep、egrep、awk、perl 等使这更加可替代。

这是一个简短的 shell 脚本。编辑包含的“delhttp.sh”,

#!/bin/bash
if [ $# -eq 0 ] ; then
    fgrep -v "http"
elif [ $# -eq 1 ] ; then
    f1=${1:-"null"}
    if [ ! -f $f1 ]; then echo "file $f1 dne"; exit 1; fi
    fgrep -v "http" $f1 #> $f2
elif [ $# -eq 2 ]; then
    f1=${1:-"null"}
    if [ ! -f $f1 ]; then echo "file $f1 dne"; exit 1; fi
    f2=${2:-"null"}
    fgrep -v "http" $f1 > $f2
fi

然后使这个文件可执行使用,

chmod +x delhttp.sh

这是一个 perl 脚本(如果您愿意的话),编辑 "delhttp.pl" 包含,

#!/bin/env perl
use strict;
use warnings;
my $f1=$ARGV[0]||"-";
my $f2=$ARGV[1]||"-";
my ($fh, $ofh);
open($fh,"<$f1") or die "file $f1 failed";
open($ofh,">$f2") or die "file $f2 failed";
while(<$fh>) { if( !($_ =~ /http/) ) { print $ofh "$_"; } }

再次,使这个文件可执行使用,

chmod +x delhttp.pl
于 2013-10-08T01:43:05.390 回答
1

你可以使用 grep。使用-v反转匹配的感觉,选择不匹配的行。

grep -v 'http' list.txt

使用 Perl 单线:

perl -ne '/^(?:(?!http).)*$/ and print' list.txt > new.txt
于 2013-10-08T02:48:34.393 回答