我有
等文字我们可以说这个文本是由行
末尾的“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服务器上工作
答案 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”上的行。
编辑:添加了一个命令,可以在最后删除额外的“或”。