簡體   English   中英

Perl:如何在Linux模式之間取得界限

[英]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[]字符,並返回已更改的字符數
  • 因此,僅當替換了3個以上的字符時,才$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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM