Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Perl:如何在linux中获取模式之间的行_Regex_Linux_Perl_Shell_Centos - Fatal编程技术网

Regex Perl:如何在linux中获取模式之间的行

Regex Perl:如何在linux中获取模式之间的行,regex,linux,perl,shell,centos,Regex,Linux,Perl,Shell,Centos,我有一个这样的文件 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:

我有一个这样的文件

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
我在perl中使用它来获得类似于

FIELDS="number: string(200) issueDate: datetime expiryDate: datetime file_path: string(200) filename: string(200) description: text"
这是通过这个命令完成的

perl-plne'$\=“FIELDS=\”“.”如果$.==1,则为“$\=”;如果eof'document.txt

现在我有了这样的完整文件

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
现在我想让输出像这样在单独的行中结束

ENTITY = JOHN
BUNDLE = Mybundle
FIELDS="number: string(200) issueDate: datetime expiryDate: datetime file_path: string(200) filename: string(200) description: text"
基本上是变量名,比如实体、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
    在输入时选择换行符,并在使用
    打印时添加换行符
  • -00
    读取段落中的输入(这些段落以两行或多行换行符结尾)
  • y |\n\r[]| | d
    用空格替换换行符,删除
    \r[]
    字符,并返回更改的字符数
  • 因此,
    $q
    仅当替换了3个以上的字符时才被分配
    字符(用于
    字段
    条目)
  • s | | |
    替换首先是非空格字符(实体、束、字段),然后是惰性字符
    =$q
输出

entity = JOHN
BUNDLE = mybundle
FIELDS = "number: string(200) issueDate: datetime expiryDate: datetime file_path: string(200) filename: string(200) description: text"
  • -l
    在输入时选择换行符,并在使用
    打印时添加换行符
  • -00
    读取段落中的输入(这些段落以两行或多行换行符结尾)
  • y |\n\r[]| | d
    用空格替换换行符,删除
    \r[]
    字符,并返回更改的字符数
  • 因此,
    $q
    仅当替换了3个以上的字符时才被分配
    字符(用于
    字段
    条目)
  • s | | |
    替换首先是非空格字符(实体、束、字段),然后是惰性字符
    =$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这样做:

      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/^\[实体\]/#从[实体]后面的行将实体另存为$e
      $b=if/^\[BUNDLE\]/#从[bundle]后面的行将bundle另存为$b
      如果(/:/){#如果行中有冒号
      chomp;$f.=“”.$\u;#…将此字段附加到$f
      }
      如果/^desc/,打印“entity=”,$e,“BUNDLE=”,$b,“FIELDS=\“$f\”\n”;
      “你的档案
      
      以下是我的awk答案的一个相当可读的perl-ish版本:

      perl-ne'
      $e=if/^\[实体\]/#从[实体]后面的行将实体另存为$e
      $b=if/^\[BUNDLE\]/#从[bundle]后面的行将bundle另存为$b
      如果(/:/){#如果行中有冒号
      chomp;$f.=“”.$\u;#…将此字段附加到$f
      }
      如果/^desc/,打印“entity=”,$e,“BUNDLE=”,$b,“FIELDS=\“$f\”\n”;
      “你的档案
      
      是否有意在两行中的
      =
      周围留有空格,而不是第三行?另外,您是否只想为多行条目添加引号?如果不将perl脚本编写为一行,那么编写一个可读性好的perl脚本会更容易。如果/else/while和长变量名在可读性方面发挥了神奇的作用,那么在
      =
      的两行中使用空格,而不是第三行,这是故意的吗?另外,您是否只想为多行条目添加引号?如果不将perl脚本编写为一行,那么编写一个可读性好的perl脚本会更容易。if/else/while和长变量名对可读性有神奇的作用
      chomp
      ,最后一个打印换行可以通过在
      -00
      开关之前添加
      -l
      来删除。您能解释一下每个部分在做什么吗
      chomp
      ,最后一个打印换行可以通过在
      -00
      之前添加
      -l
      来删除吗开关。你能解释一下每个部件都在做什么吗