2017-09-14 106 views
-1

我已经去下面的文本SED插入匹配图案

1012 - ABC-DEF

VIP

编号

指数

诊断

变异

硬件

2017年6月19日14:41:28

,我想追加 “1012 - ABC-DEF” 两个模式“之间每行的开始1012 - ABC-DEF”和 “2017年6月19日14:41:28”

这样的结果将是:

1012 - ABC-DEF

1012 - ABC-DEF VIP

1012 - ABC-DEF数

1012 - ABC-DEF指数

1012 - ABC-DEF诊断

1012 - ABC-DEF变

1012 - ABC-DEF硬件

2017年6月19日14时41分二十八秒

虽然我有解决方案,但我正在寻找更好的解决方案。

这里是我的解决方案:

sed -i "/^\([0-9][0-9][0-9][0-9]\) - ABC-DEF/,/2017\-\([0-9][0-9]\)\-\([0-9][0-9]\) \([0-9][0-9]\)\:\([0-9][0-9]\)\:\([0-9][0-9]\)/{/^\([0-9][0-9][0-9][0-9]\) - ABC-DEF/n;/2017\-\([0-9][0-9]\)\-\([0-9][0-9]\) \([0-9][0-9]\)\:\([0-9][0-9]\)\:\([0-9][0-9]\)/!{s/^/1012 - ABC-DEF /g}}" * 

我想是如果文本模式 “1012 - ABC-DEF” 匹配它会自动在{s/^/1012填写 - ABC-DEF/“} 我认为解决方案是{s/^/\ 1-ABC-DEF/g}}”但是这给了一个错误(在's'命令的RHS上无效的参考\ 1)。

如何解决填写参考“1012”自动或者甚至更好填写引用“1012” - “ABC” - “DEF”自动

回答

0
awk '/^[0-9]{4} - ABC-DEF/{p=$0;print;next} 
    /^[0-9]{4}-[0-9]{2}-/{p=""}$0=(p?p" ":"") $0' file 

这一个班轮阅读2012-ABC-DEF线并将其放到所有行的开头,直到2017-...(date)行。

一个小测试:

kent$ cat f 
foo 
foo 
1012 - ABC-DEF 
VIP 
Number 
Index 
Diagnosis 
Variant 
Hardware 
2017-06-19 14:41:28 
foo 
foo 

kent$ awk '/^[0-9]{4} - ABC-DEF/{p=$0;print;next}/^[0-9]{4}-[0-9]{2}-/{p=""}$0=(p?p" ":"") $0' f 
foo 
foo 
1012 - ABC-DEF 
1012 - ABC-DEF VIP 
1012 - ABC-DEF Number 
1012 - ABC-DEF Index 
1012 - ABC-DEF Diagnosis 
1012 - ABC-DEF Variant 
1012 - ABC-DEF Hardware 
2017-06-19 14:41:28 
foo 
foo 
+0

感谢@kent的回答,我是一个新手,不熟悉你的awk或其他人可以产生sed的代码? – Anekdote