sed在模式之间的线前插入匹配模式

时间:2017-09-14 11:34:26

标签: regex sed multiline

我有以下文字

  

1012 - ABC-DEF

     

VIP

     

     

索引

     

诊断

     

变体

     

硬件

     

2017-06-19 14:41:28

我想在“1012 - ABC-DEF”和“2017-06-19 14:41:28”之间的每一行的开头追加“1012 - ABC-DEF”

所以结果将是:

  

1012 - ABC-DEF

     

1012 - ABC-DEF VIP

     

1012 - ABC-DEF编号

     

1012 - ABC-DEF指数

     

1012 - ABC-DEF诊断

     

1012 - ABC-DEF Variant

     

1012 - ABC-DEF硬件

     

2017-06-19 14:41:28

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

这是我的解决方案:

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 / g}}“ 我认为解决方案将是{s / ^ / \ 1 - ABC-DEF / g}}“但这会产生错误(在's'命令的RHS上无效的引用\ 1.)。

什么是自动填写参考“1012”的解决方案,甚至更好地自动填写参考“1012” - “ABC” - “DEF”

1 个答案:

答案 0 :(得分: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