2017-09-14 79 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