Bash中的部分字符串拆分

时间:2019-04-01 18:05:32

标签: string bash split partial

让我们考虑以下字符串:

00x \ 00x \ 00x \ 00x \ 00x \ 00x \ 00x \ 00x \ 00x \ g09x \ t20x \ 00x \ 00x \ 00x \

我要检索的是这个

00x \ 00x \ 00x \ 00x \ 00x \ 00x \ 00x \ 00x \ 00x \ g09x \ t20x \

基本上,逻辑是:

  1. 只要是00x \,就继续读取字符串的其余部分。

  2. 只要它不是00x \,就继续读取字符串的其余部分。 在那里拆分。

如何在bash中实现?请注意,中间有一个“ 9”和一个“ t”。因此,在2 00x \令牌之间可能存在“垃圾”。因此,我不能只是将字符串拆分为令牌,也不能使用cut(不是固定长度)。我可以用awk或sed做任何魔术吗?

谢谢。

编辑:输入的字符串可以在其他字符之后00x \开头。像这样:00x \ 00x \ 00x \ 00x \ 00x \ 00x \ 00x \ 00x \ 00x \ g09x \ t20x \ 00x \ 00x \ 00x \ 00x \ 00x \ 00x \ 00x \ 00x \ 00x \ GL7Dx \ 00x \ 00x \ 00x \ 00x \ 00x \ 00x \ 00x \ 00x \ 00x \ 00x \ 00x \ BCx \ V6Ax \ 00x \ 00x \ 00x \ 00x \ 00x \ 00x \ 00x \ 00x \ 00x \ 00x \ 00x \ 00x \ H50x \我想要的仍然是00x \ 00x \ 00x \ 00x \ 00x \ 00x \ 00x \ 00x \ 00x \ g09x \ t20x \

1 个答案:

答案 0 :(得分:1)

awk中的内容

$ awk '
BEGIN {
    FS=ORS="\\"
}
{
    for(i=1;i<=NF;i++)
        if(($i=="00x")&&p!="00x"&&p!="") {
            printf "\n"
            exit
        } else {
            p=$i
            print $i
        }
}' file

输出更新后的数据

00x\00x\00x\00x\00x\00x\00x\00x\00x\g09x\t20x\

在Perl中使用负向后看:

$ perl -ne 's/(?<!00x)\\00x.*/\\/g;print' file
00x\00x\00x\00x\00x\00x\00x\00x\00x\g09x\t20x\