bash将文本拆分为有限字符桶(数组成员)

时间:2010-05-07 08:25:18

标签: bash sed split awk

我有

等文字

http://pastebin.com/H8zTbG54

我们可以说这个文本是由行

末尾的“OR”分割的规则集

我需要将一组行(规则)放入桶中(bash数组成员)但我有每个数组成员的字符限制,这是1024

所以每个数组成员都应该包含一组规则,但每个数组成员的字符数不能超过1024

假设规则文本如 a OR b OR c或d或e或f或g或h

输出应该是 数组成员1 = a OR b

数组成员2 = c OR d OR e

数组成员3 = f OR g

数组成员4 = h

任何人都可以帮我这么做吗

在solaris 10服务器上工作

2 个答案:

答案 0 :(得分:1)

这不是完全无关紧要的,需要更多的澄清,但基本上你最初通过OR / AND(可能还有一些其他模式,根据你的需要)拆分它们然后再递归拆分那些大于1024的块。

P.S。这似乎是其中一种情况,当使用完全成熟的脚本语言,如Perl,Python,PHP或任何其他语言时,能够更方便地获得结果。

EG。 PHP中的一个基本内容(不确定是否完全正确,有一段时间没有完成PHP),可以这样:

function splitByOr($input)
{
  $tokens = explode(" OR ",$input);
  foreach ($t in $tokens)
    if (strlen($t) > 1024)
         $t=splitByOr($t);
  return $tokens;
}

答案 1 :(得分:0)

samplerule文件中的各个规则的长度都不超过148个字符 - 远小于1024个字符的限制。如果规则超出了这个限制,你就没有说明应该怎么做。

这是一个非常简单的Bash脚本,它将您的样本文本“\ n”拆分为名为“rules”的数组。它会跳过超过1024个字符的行并输出错误消息:

#!/bin/bash
while read -r line
do
    (( count++ ))
    if (( ${#line} > 1024 ))
    then
        echo "Line length limit of 1024 characters exceeded: Length: ${#line} Line no.: $count"
        echo "$line"
        continue
    fi
    rules+=($line)
done < <(echo -e "$(<samplerule)")

此变体将截断行长而不考虑后果:

#!/bin/bash
while read -r line
do
    rules+=(${line:0:1024})
done < <(echo -e "$(<samplerule)")

如果文字“\ n”实际上不在文件中并且您需要使用Bash数组而不是在AWK中完全编码,请更改上述任一版本中的行:

done < <(echo -e "$(<samplerule)")

这样说:

done < <(awk 'BEGIN {RS="OR"} {print $0,"OR"}' samplerule)
if [[ "${rules[${#rules[@]}-1]}" == "OR" ]]
then
    unset "rules[${#rules[@]}-1]"
fi

将分割“OR”上的行。

编辑:添加了一个命令,可以在最后删除额外的“或”。