格式化结果为Bash

时间:2015-06-24 07:23:01

标签: bash sed

例如,我有 test.txt ,其中包含以下行:

  

L1〜00〜00〜00〜00〜00〜测试〜122113〜00〜L2〜这〜是〜A〜样品〜数据〜L1〜00〜00〜00〜00〜00〜测试1〜123456〜00

我想得到" 测试"和" Test1 ",两者都在L1~00~00~00~00~00~之后,格式如下。

Test, Test1

我的bash脚本中已经有了这一行:

grep -oP 'L1(?:.[\w\s]*){5}.(\K[\w\s]*)' < test.txt

但它返回不同的格式:

Test
Test1

如何通过在脚本中添加sed来实现此目的?我还是个新手。我希望有人可以帮助我。谢谢

4 个答案:

答案 0 :(得分:2)

当然,如果你正在使用Perl正则表达式,你也可以直接使用Perl。

perl -nle '@m = m/L1(?:.[\w\s]*){5}.([\w\s]*)/g; print(join(",", @m)) if @m' test.txt

这会将匹配收集到@m,然后如果@m中有匹配项,则用逗号打印它们。 -l选项可以方便地在print上提供尾随换行符,-n选项可以使Perl一次一个地循环输入行,例如sed

答案 1 :(得分:1)

您可以使用:

grep -oP 'L1(?:.[\w\s]*){5}.(\K[\w\s]*)' test.txt | sed 'N;s/\n/, /'
Test, Test1

答案 2 :(得分:1)

如果你不倾向于使用perl正则表达式 - 你可以单独依靠sed

sed -rn 's#(L1.)((\w+.){5})(\w+)(.*\1\2)(\w+)(.*)#\4, \6#p' < test.txt

答案 3 :(得分:1)

用于多字符RS和RT的Wth GNU awk:

$ awk -v RS='L1~00~00~00~00~00~' -F~ 'NF{ORS=(RT?", ":"\n"); print $1}' file
Test, Test1

上面只是将每一行拆分为包含L1~00~00~00~00~00~之间任何内容的记录,并将每条记录拆分为~之间的字段,然后打印每个字段的第一个字段(即介于每个L1~00~00~00~00~00~和下一个~之间,如果它不是最后一条记录,则后跟,,如果是\n,则为 .factory('CoverageService', ['$http', function ($http) { return{ GetCoverageReport: function () { return $http.get('../../../js-test-reports/coverage/Chrome 43.0.2357%20(Windows%207)/cobertura-coverage.xml'); },