用于包装文本文件中的行?

时间:2011-03-10 00:28:08

标签: sed

我是Sed的新手。我有一堆包含数据的ASCII文件,如下所示:

Test_Version:2.6.3
Model-Manufacturer:
HR21-100
Test_Version:2.6.3
Model-Manufacturer:
D12-100

我想要做的就是为“模型制造商:”折叠线条,如下所示:

Test_Version:2.6.3
Model-Manufacturer:HR21-100
Test_Version:2.6.3
Model-Manufacturer:D12-100

我尝试使用sed,因为我发现“Model-Manufacturer:”之后有2个十六进制值(\ n为0xA)

cat myfile| sed -n "/[[:xdigit:]]\{2\}/p"

对于我的匹配代码,输出看起来像这样:

Model-Manufacturer:
HR21-100
Model-Manufacturer:
D12-100

这告诉我,我走在正确的轨道上,对吗?我无法弄清楚的是为“模型制造商:”折叠线的正确匹配/替换代码。尝试

cat myfile| sed "s/[[:xdigit:]]\{3\}//g"

完成搞砸了我的档案。知道怎么做吗?

3 个答案:

答案 0 :(得分:5)

$ cat test.txt
Test_Version:2.6.3
Model-Manufacturer:
HR21-100
Test_Version:2.6.3
Model-Manufacturer:
D12-100

$ cat test.txt | sed -e '/:$/N; s/:\n/:/'
Test_Version:2.6.3
Model-Manufacturer:HR21-100
Test_Version:2.6.3
Model-Manufacturer:D12-100

这是每个sed命令的细分。

/:$/N

如果输入行末尾有一个':',请在模式空间的末尾插入换行符并附加下一行输入。

s/:\n/:/

将“:”替换为带有“:”的换行符,删除换行符。

答案 1 :(得分:2)

括号表达式[[:xdigit:]]匹配任何文本字符01234567890abcdefABCDEF。这就是出现以使用您尝试的方式匹配的原因 - 因为这些行中有“e”,“a”,“1”,“2”和“0”字符。如果您想匹配任何非打印字符,可以使用[[:cntrl:]]。但是,要专门匹配换行符,您可以使用\n\x0a\o12\d10

然而, 这并不是您想要做的事情,因为sed在每一行的末尾都没有看到换行符。它只会看到它们嵌入在它们附加在一起的行中。

这是一个sed命令,可以将所需的行追加到一起:

sed '/Model-Manufacturer:/{N;s/\n//}' myfile

说明:

  • /Model-Manufacturer:/{ - 如果一行符合“模型制造商:”
    • N - 附加下一行
    • s/\n// - 删除追加操作添加的嵌入式换行符
  • } - 结束如果

答案 2 :(得分:0)

你也可以使用awk

gawk '/Model/{printf $0;getline;print;next}1' file