2014-02-14 22 views
0

我有這樣的Perl:如何獲得模式之間的線在linux

number: string(200) 
issueDate: datetime 
expiryDate: datetime 
file_path: string(200) 
filename: string(200) 
description: text 

我在Perl中使用這個文件,以獲得ouputlike

FIELDS="number: string(200) issueDate: datetime expiryDate: datetime file_path: string(200) filename: string(200) description: text" 

這是通過這個命令完成

perl -plne '$_ = "FIELDS=\""."$_" if $. == 1; $\ = " ";$_ = "\""."$_" if eof' document.txt

現在我有這樣的完整文件

[entity] 
JOHN 

[BUNDLE] 
mybundle 

[FIELDS] 
number: string(200) 
issueDate: datetime 
expiryDate: datetime 
file_path: string(200) 
filename: string(200) 
description: text 

現在我想在不同的行

ENTITY = JOHN 
BUNDLE = Mybundle 
FIELDS="number: string(200) issueDate: datetime expiryDate: datetime file_path: string(200) filename: string(200) description: text" 

的輸出中,以終端這樣的基本變量名稱類似實體上,捆綁,它應該從文件

讓我怎麼能做到這一點

+1

是不是故意的,你有'='兩線周圍的空間,而第三個?還有,你是否只想爲多行條目添加引號? – TLP

+0

如果你不把它寫成一行代碼,那麼編寫一個可讀的perl腳本更容易。 if/else/while和long變量名稱爲了可讀性而做魔術 – Simson

回答

3
perl -l -00pe '$q = y|\n\r[]| |d >3 && q("); s|(\S+)\s*|$1 = $q|; $_.= $q' file 

輸出

entity = JOHN 
BUNDLE = mybundle 
FIELDS = "number: string(200) issueDate: datetime expiryDate: datetime file_path: string(200) filename: string(200) description: text" 
  • -l要吃掉換行符上輸入和添加的它在使用print
  • -00讀取段落(這些由兩個或更多個換行終止)
  • y|\n\r[]| |d替換換行符用空格輸入,刪除\r[]字符,並返回改變了多少個字符的數量
  • 因此$q被分配爲"僅當超過3個字符被替換時才使用字符(用於FIELDS輸入)
  • s|||取代反應第一個非空格字符(實體,捆綁,場),和惰性氣體= $q後他們
+1

'chomp'並且可以通過在'-00'開關之前添加'-l'來刪除最後一個打印換行符。 – TLP

+0

你能解釋一下每個部分在做什麼嗎? – user3147180

0

您可以使用awk像這樣做:

awk ' 
    /^\[entity\]/ {getline e;next} 
    /^\[BUNDLE\]/ {getline b;next} 
    /:/   {f=f " " $0} 
    /^description/ {print "entity=" e RS "BUNDLE=" b RS "FIELDS=" f;f=""}' yourfile 

說明

如果我找到一條以[實體]開頭的行,我抓住以下行並保存爲「e」

如果我發現的線開始的[管束],我抓住下面的行,並保存爲「b」的

如果我發現與結腸一條線,我將其追加到「f」,其中我保存的字段(帶添加空格)

如果我找到一行以「description」開頭的行,我打印出迄今爲止發現的內容並清除字段變量「f」。

0

這裏是我的AWK回答的相當可讀的perl -ish版本:

perl -ne ' 
    $e=<> if /^\[entity\]/;  # save entity as $e from line after [entity] 
    $b=<> if /^\[BUNDLE\]/;  # save bundle as $b from line after [BUNDLE] 
    if(/:/){      # if there's a colon in the line 
     chomp; $f.= " " . $_;  # .. append this field to $f 
    } 
    print "entity = ",$e,"BUNDLE = ",$b,"FIELDS = \"$f\"\n" if /^desc/; 
' yourfile 
相關問題