嗨,我是新的外壳编程我希望你能引导我一起谢谢。
嗨,我需要一个函数从一个.txt文件中搜索书名或作者,并回显以下内容

Title:*Enter*
Author:Scissorhands

找到3条记录:
傻瓜书,John Scissorhands,15.01美元,10, 5美元
傻瓜用爪哇语,玛丽剪刀手,16.02,20,15美元
vb.net的假人,爱德华剪刀手,$17.03,30,25

Found 3 records :
C++ for dummies, John Scissorhands, $15.01, 10, 5
Java for dummies, Mary Scissorhands, $16.02, 20, 15
VB.NET for dummies, Edward Scissorhands, $17.03, 30, 25

我的文件格式如下
书名:作者:价格:数量:售出数量
哈利波特:詹姆斯:12.99:197:101
function Search_book
{
 FILE="/home/student/Downloads/BookDB.txt"
 echo found 1 records : $FILE contents
 cat FILE
}

最佳答案

编辑:对不起,我误解了你的问题。
更新的混合溶液:

#!/bin/bash

read -p "Enter search term: " search
perl -ne '
    BEGIN{ $pattern = $ARGV[0]; shift; $n=0 }
    @a=split /:/;
    if ($a[0] =~ m/$pattern/i or $a[1] =~ m/$pattern/i) {
      print "$a[0], $a[1],\$$a[2],$a[3],$a[4]\n";
      $n += 1;
    }
    END{ print "Found $n title(s).\n" }
  ' "$search" /home/student/Downloads/BookDB.txt

输出:
$ ./search.sh
Enter search term: star wars vi
Title: Star wars VI - return of the jedi
Found 1 title(s).

并不是说您需要通配符的正则表达式(即.而不是?.*而不是*,等等),而且您不需要将通配符放在搜索词的开头/结尾以查找给定(子)字符串中的任何匹配项。
当然,您也可以完全在Perl中完成此操作,而无需使用shell脚本包装器:
#!/usr/bin/env perl

use strict;
use warnings;

my $booklist = './books.txt';
my @book;

print "Enter search term: ";
chomp (my $pattern = <>);

open BOOKS, "<$booklist" or die $!;

my $n = 0;
foreach (<BOOKS>) {
  chomp;
  @book = split /:/;
  if ($book[0] =~ m/$pattern/i or $book[1] =~ m/$pattern/i) {
    print "$book[0], $book[1],\$$book[2],$book[3],$book[4]\n";
    $n += 1;
  }
}

close BOOKS;

print "Found $n title(s).\n";

有关bash解决方案,请参见perl

关于linux - 按书名/作者搜索书,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17851390/

10-13 07:23