[英]Perl: how to get lines between patterns in linux
我有一個這樣的文件
number: string(200)
issueDate: datetime
expiryDate: datetime
file_path: string(200)
filename: string(200)
description: text
我在Perl中使用它來獲得輸出
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"
基本上是變量NAME,例如ENTITY,BUNDLE,它應該從文件中獲取
我怎樣才能做到這一點
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
y|\\n\\r[]| |d
用空格替換換行符,刪除\\r[]
字符,並返回已更改的字符數 $q
分配"
字符"
(用於FIELDS
條目) s|||
替換使用第一個非空格chars(entity,bundle,fields),其后為inerts = $q
您可以使用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
說明 :
如果我找到以[entity]開頭的行,則抓取以下行並另存為“ e”
如果我發現以[BUNDLE]開頭的行,則抓取以下行並另存為“ b”
如果找到帶冒號的行,請將其附加到“ f”,在其中保存字段(帶有空格)
如果找到以“ description”開頭的行,則打印出到目前為止所發現的內容,並清除字段變量“ f”。
這是我的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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.