使用BASH的块文本文件

问题描述 投票:0回答:2

我对Bash比较陌生,我想把一个包含在zip文件中的txt块。块必须从“channel8”的​​5行到“channel10”的2行

12082008;pull done;ret=34;Y
08072008;push hanged;s=3;N
15082008;pull done;ret=34;Y
01062008;psuh done;ret=23;Y
18082007;old entry;old;N
08072008;push hanged;s=3;N
15082008;pull done;ret=34;Y
01062008;psuh done;ret=23;Y
18082007;old entry;old;N
08072008;push hanged;s=3;N
15082008;pull done;ret=34;Y
01062008;psuh done;ret=23;Y
18082007;old entry;old;N
08072008;push hanged;s=3;N
15082008;pull done;ret=34;Y
01062008;psuh done;ret=23;Y
18082007;old entry;old;N
Channel8
08072008;push hanged;s=3;N
15082008;pull done;ret=34;Y
01062008;psuh done;ret=23;Y
18082007;old entry;old;N
Channel9
08072008;push hanged;s=3;N
15082008;pull done;ret=34;Y
01062008;psuh done;ret=23;Y
18082007;old entry;old;N
Channel10
08072008;push hanged;s=3;N
15082008;pull done;ret=34;Y
01062008;psuh done;ret=23;Y
18082007;old entry;old;N
Channel11
01062008;psuh done;ret=23;Y

到目前为止,我只能成功进入第10频道,见下文:

12082008;pull done;ret=34;Y
08072008;push hanged;s=3;N
15082008;pull done;ret=34;Y
01062008;psuh done;ret=23;Y
18082007;old entry;old;N
08072008;push hanged;s=3;N
15082008;pull done;ret=34;Y
01062008;psuh done;ret=23;Y
18082007;old entry;old;N
08072008;push hanged;s=3;N
15082008;pull done;ret=34;Y
01062008;psuh done;ret=23;Y
18082007;old entry;old;N
08072008;push hanged;s=3;N
15082008;pull done;ret=34;Y
01062008;psuh done;ret=23;Y
18082007;old entry;old;N
Channel8
08072008;push hanged;s=3;N
15082008;pull done;ret=34;Y
01062008;psuh done;ret=23;Y
18082007;old entry;old;N
Channel9
08072008;push hanged;s=3;N
15082008;pull done;ret=34;Y
01062008;psuh done;ret=23;Y
18082007;old entry;old;N
Channel10
08072008;push hanged;s=3;N
15082008;pull done;ret=34;Y
01062008;psuh done;ret=23;Y
18082007;old entry;old;N

但我不知道如何使用我的bash输出从通道8中选择。

这是我的代码

for file in ./*.zip; do head -$(($(unzip -c $file | grep -n $channel_after | cut -f1,1 -d":")-1)) <(unzip -c $file);done
bash grep zip tail unix-head
2个回答
1
投票

sed会做这个工作吗?

unzip -c $file | sed -n '/Channel8/,/Channel10/p'

sed命令将打印Channel8Channel10之间的所有内容,包括Channel线。

如果你不想要包括Channel线,你可以使用另一个sed删除而不是打印。

unzip -c $file | sed '1,/Channel8/d;/Channel10/,$d'

-1
投票

听起来你需要的是:

unzip -c "$file" |
    awk '
        /^Channel8$/ { seenBeg = 1 }

        seenBeg {
            if ( seenEnd && /^Channel/ ) {
                exit
            }
            else if ( /^Channel10$/ {
                seenEnd = 1
            }
            print
        }
    '
© www.soinside.com 2019 - 2024. All rights reserved.