我是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"
完成搞砸了我的档案。知道怎么做吗?
答案 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