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[]
- 因此,
仅当替换了3个以上的字符时才被分配$q
字符(用于“
条目)字段
替换首先是非空格字符(实体、束、字段),然后是惰性字符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[]
- 因此,
仅当替换了3个以上的字符时才被分配$q
字符(用于“
条目)字段
替换首先是非空格字符(实体、束、字段),然后是惰性字符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
来删除吗开关。你能解释一下每个部件都在做什么吗