我有这样的文本:
http://pastebin.com/H8zTbG54
我们可以说这个文本是由行尾的"OR“分割的一组规则
我需要将一组行(规则)放入存储桶(bash数组成员),但每个数组成员的字符数限制为1024
因此每个数组成员都应该包含一组规则,但每个数组成员字符数不能超过1024
假设规则文本类似a、b、c、d、e、f、g或h
输出应为数组成员1=a或b
数组成员2=c或d或e
数组成员3=f或g
数组成员4=h
有人能帮我做这件事吗?
在solaris 10服务器上工作
发布于 2010-05-07 16:35:56
这并不完全是微不足道的,需要更多的说明,但基本上您首先通过OR/AND (可能还有其他一些模式,取决于您的需求)拆分它们,然后递归拆分那些大于1024的块。
附注:这似乎是其中的一种情况,当使用成熟的脚本语言,如Perl,Python,PHP或任何其他语言时,将能够更方便地实现结果。
例如:PHP中的一件基本事情(不确定是否完全正确,有一段时间没有做过PHP ),可能是这样的:
function splitByOr($input)
{
$tokens = explode(" OR ",$input);
foreach ($t in $tokens)
if (strlen($t) > 1024)
$t=splitByOr($t);
return $tokens;
}发布于 2010-05-07 18:56:08
samplerule文件中的各个规则的长度都不超过148个字符-远远小于1024个字符的限制。如果这些规则超出了这个限制,你不会说应该如何处理它们。
这是一个非常简单的Bash脚本,它会将文本"\n“上的样本拆分为名为"rules”的and数组。它跳过超过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“上的行。
编辑:添加了一个命令来删除末尾多余的"OR“。
https://stackoverflow.com/questions/2787174
复制相似问题