2017-02-23 67 views
0

我有一个UTF-8-BOM编码的文本文件,其中大多数行以6-10位数字(每行增加数字)开始,并在其后面有一个字符串。Bash获取2个6位数字之间的字符串

我想要得到每个“行”(包括数字)在我的bash脚本中进一步处理。

这将是一个很容易做的只是使用for循环与sed -n '$line\p',但不幸的是我需要的一些字符串有换行符作为他们的一部分,所以我需要一种方法来提取两个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
  • 我需要得到较低b yte长度后面的脚本,一个字符串必须保持它的长度

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

+5

你可以复制粘贴文件的样本与预期的输出? – Inian

+0

作为一个起点,你可能想看看'awk'这样做。 –

+3

一个例子会很有用! –

回答

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 \ TA随机串
123567 \吨另一个字符串\ n该时间\尼特越过\ nmultiple线
124567 \ TA正常的字符串再次

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

注:
字符串长度将由1对于每个新行\n或制表\t增加;
,因为请求的“\ n”和“\ t”每个都是两个字符。

相关问题