如何使用 bash 从文件中的字符串匹配文本中提取记录

如何使用 bash 从文件中的字符串匹配文本中提取记录

我有一个文本文件 sample.txt 作为

=====record1
title:javabook
price:$120
author:john
path:d:
=====record2
title:.netbook
author:paul
path:f:
=====record3
author:john
title:phpbook
subject:php
path:f:
price:$150
=====record4
title:phpbook
subject:php
path:f:
price:$150

从此我想根据作者拆分数据,它应该分成 2 个文件,其中包含

test1.txt

=====record1
    title:javabook
    price:$120
    author:john
    path:d:
=====record3
    author:john
    title:phpbook
    subject:php
    path:f:
    price:$150

test2.txt

=====record2
    title:.netbook
    author:paul
    path:f:

像上面一样,我想根据作者字段动态地将主 sample.txt 文件分类为子文件。

答案1

#!/bin/bash

tr '\n' ' ' < sample.txt | sed 's:=====:\n=====:g' | sed 's: *$::g' >tmp1

grep "author:john" tmp1 | sed 's: :\n\t:g' > test1.txt
grep "author:paul" tmp1 | sed 's: :\n\t:g' > test2.txt

rm tmp1

“tr”命令将每个换行符替换为空格(整个文件现在为 1 行),
这将通过管道传输到“sed”,这将导致每个“=====”都从新行开始。第二个“sed”将删除尾随空格。所有这些都发送到临时文件中。现在每行有 1 个“记录”。

第一个“grep”将从临时文件中读取并输出所有“author”为“john”的记录,这些记录通过管道传输到“sed”,它将每个空格替换为换行符后跟制表符(以准确重现 OP 的布局)并将其发送到名为 test1.txt 的文件

第二个 grep 同上,即“paul”和“test2.txt”

最后一步是删除不再需要的临时文件,

相关内容