2014-09-23 14 views
2

我有幾個需要修改的文本文件。 他們看起來就像是:使用sed或awk從標記中搜索模式並將其插入到下一行

Tag: Brown 
Chair 
Pencil 
Tag: Red 
Apple 
Shirt 
Pant 
     # <--- some files have one or more (about less than five) blank line(s) 
Tag: Black 
Wall 

我想通過服用後話來格式化「標籤:」作爲變量,插入到下一行,直到它遇到其他「標籤」。 「標籤:」之間的界限可能會有所不同。所以在這裏輸出格式例如:

Brown Chair and Chairs 
Brown Pencil and Pencils 
Red Apple and Apples 
Red Shirt and Shirts 
Red Pant and Pants 
     # <--- blank line(s) retain BLANK(s) 
Black Wall and Walls 

正如我看看和修改在http://sed.sourceforge.net/一些樣品,但仍然沒有成功。

sed ':loop; $!N; /^Tag:/h; n; /^Tag:/!b next; t loop; :next; x; p; x' 

謝謝。

** **更新

由於@jaypal建議,並期待 「精心」 在每一個文本文件,我加入 「空行(S)」 的情況。

+1

因此,如果該文件有'標籤:White'其次是'Mouse',你得到'白色的鼠標和Mouses'?或者有些魔法創造了「白色小鼠」? – 2014-09-23 21:11:43

+0

嗯,我需要在「Tag:」之後的以下行復制單詞的邏輯,以防萬一使用反向引用。 – JoCM 2014-09-23 21:27:22

回答

2

我用的sed(不包括循環,分支或反向引用,我喜歡簡單的事情)的嘗試:

sed '/Tag:/{s/Tag: //;h;d;};G;s/\(.*\)\n\(.*\)/\2 \1 and \1s/' 

編輯:

要保留空白行:

sed '/Tag:/{s/Tag: //;h;d;};/./{G;s/\(.*\)\n\(.*\)/\2 \1 and \1s/;}' 
+0

不錯,你在BSD變種中也很開心+} – 2014-09-24 00:06:56

+0

嗯,我剛剛發現一些文件有空行(s )。我嘗試修改: sed'/ Tag:/ {s/Tag://; h; d;}; G; s/\(。* [a-zA-Z] \)\ n \(。 * [a-zA-Z] \)/ \ 2 \ 1和\ 1s \' ,但會導致效果變差。 – JoCM 2014-09-24 00:55:42

+0

@JoCM:您希望該工具如何處理空白行?打印它?刪除它? – Beta 2014-09-24 01:12:18

2

最瑣碎pluralisations的下面的代碼交易(在你的例子):

awk '/^Tag:/ {c=$2; next} {print c, $1, "and", $1"s"}' file 

如果模式匹配,第二個字段保存到c並跳到下一行。否則,用簡單的複數形式打印行上的第一個單詞。

對於一些更高檔的,它能夠pluralising更大範圍的話,你可以使用Lingua::EN::Inflect Perl模塊,:

perl -MLingua::EN::Inflect=PL -lane 'if(@F==2){$c=$F[1]}else{print "@{[$c,$_,q/and/,PL $_]}"}' file 

使用-a,使自動分屏模式。如果有兩個字段,請將第二個字段保存爲$c(您也可以使用正則表達式來完成此操作,我只是幻想了一些變體)。否則,打印列表。使用@{[ ]}並在雙引號中換行使用內置變量$"來加入默認情況下的空間列表。

測試出來:

$ cat file 
Tag: Brown 
Chair 
Pencil 
Tag: Red 
Apple 
Shirt 
Pant 
Tag: White 
Mouse 
$ perl -MLingua::EN::Inflect=PL -lane 'if(@F==2){$c=$F[1]}else{print "@{[$c,$_,q/and/,PL $_]}"}' file 
Brown Chair and Chairs 
Brown Pencil and Pencils 
Red Apple and Apples 
Red Shirt and Shirts 
Red Pant and Pants 
White Mouse and Mice 
+1

是的,perl模塊看起來不錯。太糟糕,我已經upvoted! ';)' – 2014-09-23 21:32:35

+1

+1喜歡它:-) :-) – 2014-09-23 21:35:14

+0

@Tom Fenech,它的工作原理。感謝您的代碼,它是解釋。加上關於「Lingua :: EN :: Inflect Perl模塊」的其他新知識以備將來參考。 由於我的工作偶爾與文本解析有關,我應該採用Perl語言課程;但太糟糕了,我就像是一個緩慢的學習者8-( – JoCM 2014-09-23 22:17:37

0

給定的輸入文件,張貼在的問題,並與2個空行:

$ awk '/^Tag:/{tag=$2; next} {print (NF ? tag " " $0 " and " $0 "s" : $0)}' file 
Brown Chair and Chairs 
Brown Pencil and Pencils 
Red Apple and Apples 
Red Shirt and Shirts 
Red Pant and Pants 


Black Wall and Walls 
+0

我不明白在Darwin 11.4.2中sed的版本。如果你精通sed,你能準備一個最小的完整例子嗎? – Beta 2014-09-26 02:20:58

相關問題