【发布时间】:2015-05-21 01:56:44
【问题描述】:
当涉及到多行编辑时,Sed 编辑对我来说总是一个新的挑战。在这种情况下,我有以下模式:
RECORD 4,4 ,5,48 ,7,310 ,10,214608 ,12,199.2 ,13,-19.2 ,15,-83 ,17,35 \
,18,0.8 ,21,35 ,22,31.7 ,23,150 ,24,0.8 ,25,150 ,26,0.8 ,28,25 ,29,6 \
,30,1200 ,31,1 ,32,0.2 ,33,15 ,36,0.4 ,37,1 ,39,1.1 ,41,4 ,80,2 \
,82,1000 ,84,1 ,85,1
我想转换成的:
#RECORD 4,4 ,5,48 ,7,310 ,10,214608 ,12,199.2 ,13,-19.2 ,15,-83 ,17,35 \
# ,18,0.8 ,21,35 ,22,31.7 ,23,150 ,24,0.8 ,25,150 ,26,0.8 ,28,25 ,29,6\
# ,30,1200 ,31,1 ,32,0.2 ,33,15 ,36,0.4 ,37,1 ,39,1.1 ,41,4 ,80,2 \
# ,82,1000 ,84,1 ,85,1
除此之外,我想将这 4 行(可能多于或少于 4 行(如输入中出现的不可预测)保留到一个(长)行中,而不使用反斜杠或换行符。
可以说两个任务合二为一。
sed 是强制性的。
【问题讨论】:
-
我应该提到,结果应该看起来和显示的完全一样。不是全部在一条线上。另一点是,将模式空间写入文件,并将其作为一个衬里(连续字符“\”和(可能)删除空格。原因:在随后的 sed-run 中,所有 #-signs 应该被删除再次启用线路。
-
我应该省略第二个任务,提取一个衬里,因为这会误导我想在我的编辑结果中包含一个衬里。结果应该和原来的一样,尽管每一行前面都有一个#。
-
所以...您希望一个脚本注释掉 RECORD 块,而另一个脚本将它们放在一行中,我理解正确吗?
-
可以这么说,是的。如果不能一次性完成,例如在文件编辑中进行并将一个衬里写入标准输出。其他解决方案是先运行 grep - 在进行编辑之前 - 并收集所有记录。
-
它可以一次性完成(我添加了一些关于此的内容),但在这一点上,事情变得有点难看。这是挑选毒药的老游戏。在第二遍编辑文件之前,我可能会使用两次并提取一次记录。
标签: sed pattern-matching sh multiline