首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bash将文本拆分为有限的字符桶(数组成员)

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

Stack Overflow用户
提问于 2010-05-07 16:25:18
回答 2查看 1.5K关注 0票数 0

我有这样的文本:

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服务器上工作

EN

回答 2

Stack Overflow用户

发布于 2010-05-07 16:35:56

这并不完全是微不足道的,需要更多的说明,但基本上您首先通过OR/AND (可能还有其他一些模式,取决于您的需求)拆分它们,然后递归拆分那些大于1024的块。

附注:这似乎是其中的一种情况,当使用成熟的脚本语言,如Perl,Python,PHP或任何其他语言时,将能够更方便地实现结果。

例如:PHP中的一件基本事情(不确定是否完全正确,有一段时间没有做过PHP ),可能是这样的:

代码语言:javascript
复制
function splitByOr($input)
{
  $tokens = explode(" OR ",$input);
  foreach ($t in $tokens)
    if (strlen($t) > 1024)
         $t=splitByOr($t);
  return $tokens;
}
票数 1
EN

Stack Overflow用户

发布于 2010-05-07 18:56:08

samplerule文件中的各个规则的长度都不超过148个字符-远远小于1024个字符的限制。如果这些规则超出了这个限制,你不会说应该如何处理它们。

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

代码语言:javascript
复制
#!/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)")

此变化将截断行长度,而不考虑后果:

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

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

代码语言:javascript
复制
done < <(echo -e "$(<samplerule)")

说这句话:

代码语言:javascript
复制
done < <(awk 'BEGIN {RS="OR"} {print $0,"OR"}' samplerule)
if [[ "${rules[${#rules[@]}-1]}" == "OR" ]]
then
    unset "rules[${#rules[@]}-1]"
fi

这将分割"OR“上的行。

编辑:添加了一个命令来删除末尾多余的"OR“。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2787174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档