linux 使用perl按关键字输出文件中包含的行[已关闭]

pdsfdshx  于 2022-11-02  发布在  Linux
关注(0)|答案(2)|浏览(198)

**已关闭。**此问题不符合Stack Overflow guidelines。当前不接受答案。

我们不允许问题寻求书籍、工具、软件库等的建议。您可以编辑问题,以便使用事实和引文来回答。
2天前关闭。
Improve this question
我有一个文件aa.txt

John Norman
Robert Anson
Christopher Fowler
Robert Harris
Dan Simmons

我想从键盘输入关键字,并在文件元素中逐行检查。如果为真,则输出包含该关键字的整行。例如,如果我输入单词“John”,它将输出“John Norman”我如何编写Perl脚本?(我使用Perl脚本,因为这是一个需要使用Perl的练习)非常感谢!

m1m5dgzv

m1m5dgzv1#

我想你想要的是grep

grep John aa.txt

您也可以不区分大小写地执行此操作:

grep -i John aa.txt

但是,假设您希望一次执行多个搜索。首先要弄清楚的是您想要的机制,而您的问题没有提供这一点。因此,我将第一个参数设置为文件,其余参数设置为要查找的内容:

% ./some_script file_to_search.txt key1 ...

那就很简单了


# !perl

my @keys = @ARGV;
@ARGV = shift @keys;

my $pattern = join '|', map { quotemeta } @keys;
my $compiled_re = qr/$pattern/;

while( <<>> ) {
    print if /$compiled_re/;
    }

除此之外,你必须告诉我们更多关于你正在努力做什么。

$ perl greppy.pl aa.txt John
John Norman
$ perl greppy.pl aa.txt John Robert
John Norman
Robert Anson
Robert Harris
drkbr07n

drkbr07n2#

这看起来根本不像是一个perl问题,你可以这样做:

$ while read name; do grep -F "$name" aa.txt; done
John
John Norman
Christopher
Christopher Fowler

(In上面,每个奇数行由用户输入)
我想你可以这样做:

perl -nE 'chop; open my $f, "<", "aa.txt"; while($a = <$f>) {print $a if( $a =~ $_ )}'

但请注意,这两种解决方案都不寻常。与其“从键盘输入关键字”,更典型的做法是将搜索项作为参数传递给grep,或者将它们都放入一个文件中。如果您只读一次文件,搜索可以得到极大的优化,而这里提供的解决方案只有在您确实想对每个搜索项交互地进行此操作时才有用。即使这样,更自然的做法是只为每个项调用grep,或者编写一个shell函数来简化接口。

相关问题