Bash获取2个6位数字之间的字符串

时间:2017-02-23 16:35:08

标签: string bash sed

我有一个UTF-8-BOM编码的文本文件,其中大多数行以6-10位开头(数字每行增加)并且后面有一个字符串。

我想得到每一条"线" (包括数字)在我的bash脚本中进一步处理。

通过使用sed -n '$line\p'的for循环很容易做到但不幸的是我需要的一些字符串作为其中的一部分,所以我需要一种提取字符串的方法在两个6位以上的数字(包括第一个数字)之间标记一个新行。

3"行"的例子:

123456\tA random string here
123567\t another string
this time
it goes over
multiple lines
124567\t a normal string again

我需要什么:

123456\tA random string here

123567\t another string
this time
it goes over
multiple lines

124567\t a normal string again

一些事情:

  • 字符串不包围""不幸的是
  • 字符串包含的所有数字都是< 6位数字,因此> = 6位数字始终是新字符串行的开头
  • 数字增加,因此字符串前面的数字总是低于后面的数字
  • 我想将标签或换行符等所有特殊字符转换为\t\n
  • 我需要在脚本中稍后获取字节长度,字符串必须保持其长度

我还是新来的,所以如果我把它放在错误的地方或已经回答过,请告诉我!

1 个答案:

答案 0 :(得分:0)

我希望“UTF-8-BOM编码”不是陷阱 如果不是,我的建议如下。

bash-3.1$ sed -En '/^[0-9]{6,10}/!{:a;H;n;/^[0-9]{6,10}/!ba;x;s/\n/\\n/g;s/\t/\\t/g;p};/^[0-9]{6,10}/{x;s/\t/\\t/g;1!p;x;h;z;}' input.txt

样本输入的输出(末尾有换行符):

  

123456 \ t这里的随机字符串
  123567 \ t另一个字符串\ nthis time \ nit over over \ nmultiple lines
  124567 \ t再次正常字符串

我认为相关的6-10位数字也总是在一行的开头,
否则会变得更棘手。

注意:
每个换行符\n或制表符\t的字符串长度将增加1; 因为请求的“\ n”和“\ t”分别是两个字符。