让我们考虑以下字符串:
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 \
基本上,逻辑是:
只要是00x \,就继续读取字符串的其余部分。
只要它不是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 \
答案 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\