Unix bash切割和grep

Jar*_*Rym 5 unix bash grep cut

我有一个名为db.txt的文本文件.文件中的一些示例行如下:

哈利波特和魔法石:JK罗琳:21.95:100:200

哈利波特和密室:JK罗琳:21.95:150:300

指环王,戒指团契:JRR Tolkien:32.00:500:500

权力的游戏:George RR Martin:44.50:300:250

然后在我的脚本中,我有以下几行:

echo "Enter title:"
read TITLE

cut -d ":" -f 1 db.txt | grep -iw "$TITLE" | while read LINE
do
    STRING="`echo $LINE | cut -d ":" -f 1`,"
    STRING="$STRING `echo $LINE | cut -d ":" -f 2`, "
    STRING=" \$$STRING`echo $LINE | cut -d ":" -f 3`,"
    STRING=" $STRING`echo $LINE | cut -d ":" -f 4`,"
    STRING=" $STRING`echo $LINE | cut -d ":" -f 5`"
done
Run Code Online (Sandbox Code Playgroud)

有没有办法从剪切中获取特定字段然后将整行传递到while循环?

例如,如果我输入"哈利波特",它应该显示:

哈利波特和魔法石,JK罗琳,21.95美元,100,200美元

哈利波特和密室,JK罗琳,21.95美元,150美元,300美元

Mat*_*Mat 5

如果你cut没有grep使用bash的正则表达式匹配(或者可以使用shell模式匹配),你可以在没有的情况下执行此操作.

我们的想法是逐行读取文件,然后将该行拆分为一个数组.完成后,进行所需的比较和输出.

这是该技术的演示:

#! /bin/bash
echo "Title:"
read title

# shopt -s nocasematch           # if you want case-insensitive matching

while read line ; do             # this read takes data from input.txt, see
                                 # end of loop
        IFS=: read -a parts <<< "$line"  # this splits the line on ":" into
                                         # an array called parts

        if [[ ${parts[0]} =~ $title ]] ; then  # regex matching
                printf "%s -- %s\n" "${parts[1]}" "${parts[2]}"
        fi
done < input.txt
Run Code Online (Sandbox Code Playgroud)