在bash中,如何在忽略换行符和换行符之间的空格的情况下捕获字符串匹配项和新行之间的字符串?
我有一堆清单文件,我正试图迭代以从中提取导入包。Import包是新行分隔的,后面是一个空格,用于所有连续的包导入,直到Import语句结束。 然后,它后面是一个新行,没有空间放置下一个属性(本例中为uri)。我只需要读取import package属性,即import package后跟所有换行符,然后是空格模式 清单导入语句示例如下所示在bash中,如何在忽略换行符和换行符之间的空格的情况下捕获字符串匹配项和新行之间的字符串?,bash,awk,sed,git-bash,Bash,Awk,Sed,Git Bash,我有一堆清单文件,我正试图迭代以从中提取导入包。Import包是新行分隔的,后面是一个空格,用于所有连续的包导入,直到Import语句结束。 然后,它后面是一个新行,没有空间放置下一个属性(本例中为uri)。我只需要读取import package属性,即import package后跟所有换行符,然后是空格模式 清单导入语句示例如下所示 Bnd-LastModified: 1494408636933 Bundle-ManifestVersion: 2 Import-Package: com.a
Bnd-LastModified: 1494408636933
Bundle-ManifestVersion: 2
Import-Package: com.advantco.base,com.advantco.base.logging,com.advant
co.base.mime,com.advantco.base.net,com.advantco.base.variablesubstitu
tion,com.advantco.rest,com.advantco.rest.auth,com.advantco.rest.auth.
oauth2,com.advantco.sugarcrm.core,com.advantco.sugarcrm.core.adapter,
com.advantco.sugarcrm.core.error,com.advantco.sugarcrm.core.iface,com
.advantco.sugarcrm.core.object,com.advantco.sugarcrm.core.object.meta
data,com.advantco.sugarcrm.core.rest,com.advantco.sugarcrm.core.rest.
auth,com.advantco.sugarcrm.core.rest.metadata,com.advantco.sugarcrm.c
ore.rest.op,com.advantco.sugarcrm.core.rest.op.v10,com.advantco.sugar
crm.core.rest.parser,com.advantco.sugarcrm.core.rest.parser.object,co
m.advantco.sugarcrm.core.rest.parser.xml,com.advantco.sugarcrm.core.r
est.service,com.advantco.sugarcrm.core.result,com.advantco.sugarcrm.c
ore.result.v10,com.advantco.sugarcrm.core.service,com.advantco.sugarc
rm.core.util,com.advantco.sugarcrm.core.xml,javax.activation,javax.cr
ypto,javax.crypto.spec,javax.mail,javax.xml.bind,javax.xml.parsers,ja
vax.xml.stream,javax.xml.transform,javax.xml.transform.dom,javax.xml.
transform.stream,org.apache.commons.codec.binary,org.apache.commons.c
ollections4.map,org.apache.commons.httpclient,org.apache.commons.http
client.util,org.json
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.6))"
Tool: Bnd-3.3.0.201609221906
Export-Package: com.advantco.sugarcrm.core;uses:="com.advantco.base.lo
gging,com.advantco.sugarcrm.core.object";version="1.0.0",com.advantco
.sugarcrm.core.adapter;uses:="com.advantco.base,com.advantco.base.log
ging,com.advantco.base.net,com.advantco.base.variablesubstitution,com
.advantco.sugarcrm.core,com.advantco.sugarcrm.core.error,com.advantco
.sugarcrm.core.object,com.advantco.sugarcrm.core.object.metadata";ver
sion="1.0.0",com.advantco.sugarcrm.core.error;version="1.0.0",com.adv
antco.sugarcrm.core.iface;uses:="com.advantco.sugarcrm.core.error,com
.advantco.sugarcrm.core.object";version="1.0.0",com.advantco.sugarcrm
.core.object;uses:="com.advantco.base,com.advantco.base.mime,com.adva
ntco.base.net,com.advantco.sugarcrm.core.error,com.advantco.sugarcrm.
Bnd-LastModified: 1494408636933
Bundle-ManifestVersion: 2
Import-Package: com.advantco.base,com.advantco.base.logging,com.advant
co.base.mime,com.advantco.base.net,com.advantco.base.variablesubstitu
tion,com.advantco.rest,com.advantco.rest.auth,com.advantco.rest.auth.
oauth2,com.advantco.sugarcrm.core,com.advantco.sugarcrm.core.adapter,
com.advantco.sugarcrm.core.error,com.advantco.sugarcrm.core.iface,com
.advantco.sugarcrm.core.object,com.advantco.sugarcrm.core.object.meta
data,com.advantco.sugarcrm.core.rest,com.advantco.sugarcrm.core.rest.
auth,com.advantco.sugarcrm.core.rest.metadata,com.advantco.sugarcrm.c
ore.rest.op,com.advantco.sugarcrm.core.rest.op.v10,com.advantco.sugar
crm.core.rest.parser,com.advantco.sugarcrm.core.rest.parser.object,co
m.advantco.sugarcrm.core.rest.parser.xml,com.advantco.sugarcrm.core.r
est.service,com.advantco.sugarcrm.core.result,com.advantco.sugarcrm.c
ore.result.v10,com.advantco.sugarcrm.core.service,com.advantco.sugarc
rm.core.util,com.advantco.sugarcrm.core.xml,javax.activation,javax.cr
ypto,javax.crypto.spec,javax.mail,javax.xml.bind,javax.xml.parsers,ja
vax.xml.stream,javax.xml.transform,javax.xml.transform.dom,javax.xml.
transform.stream,org.apache.commons.codec.binary,org.apache.commons.c
ollections4.map,org.apache.commons.httpclient,org.apache.commons.http
client.util,org.json
url:http://sample.org
Uri或所需功能或导出包不能硬编码,可能是导入包后的其他标志,因此我需要读取所有行,包括导入包和所有新行,然后是导入包后的空格,直到我得到一行后跟一个新属性字段,而不是它前面的空格(不一定是给定的标题)
输出类似
Import-Package: com.advantco.base,com.advantco.base.logging,com.advant
co.base.mime,com.advantco.base.net,com.advantco.base.variablesubstitu
tion,com.advantco.rest,com.advantco.rest.auth,com.advantco.rest.auth.
oauth2,com.advantco.sugarcrm.core,com.advantco.sugarcrm.core.adapter,
com.advantco.sugarcrm.core.error,com.advantco.sugarcrm.core.iface,com
.advantco.sugarcrm.core.object,com.advantco.sugarcrm.core.object.meta
data,com.advantco.sugarcrm.core.rest,com.advantco.sugarcrm.core.rest.
auth,com.advantco.sugarcrm.core.rest.metadata,com.advantco.sugarcrm.c
ore.rest.op,com.advantco.sugarcrm.core.rest.op.v10,com.advantco.sugar
crm.core.rest.parser,com.advantco.sugarcrm.core.rest.parser.object,co
m.advantco.sugarcrm.core.rest.parser.xml,com.advantco.sugarcrm.core.r
est.service,com.advantco.sugarcrm.core.result,com.advantco.sugarcrm.c
ore.result.v10,com.advantco.sugarcrm.core.service,com.advantco.sugarc
rm.core.util,com.advantco.sugarcrm.core.xml,javax.activation,javax.cr
ypto,javax.crypto.spec,javax.mail,javax.xml.bind,javax.xml.parsers,ja
vax.xml.stream,javax.xml.transform,javax.xml.transform.dom,javax.xml.
transform.stream,org.apache.commons.codec.binary,org.apache.commons.c
ollections4.map,org.apache.commons.httpclient,org.apache.commons.http
client.util,org.json
然后我就可以把新的线条去掉
Import-Package:com.advantco.base,com.advantco.base.logging,com.advantco.base.mime,com.advantco.base.net,com.advantco.base.variablesubstitution,com.advantco.rest,com.advantco.rest.auth,com.advantco.rest.auth.oauth2,com.advantco.sugarcrm.core,com.advantco.sugarcrm.core.adapter,com.advantco.sugarcrm.core.error,com.advantco.sugarcrm.core.iface,com.advantco.sugarcrm.core.object,com.advantco.sugarcrm.core.object.metadata,com.advantco.sugarcrm.core.rest,com.advantco.sugarcrm.core.rest.auth,com.advantco.sugarcrm.core.rest.metadata,com.advantco.sugarcrm.core.rest.op,com.advantco.sugarcrm.core.rest.op.v10,com.advantco.sugarcrm.core.rest.parser,com.advantco.sugarcrm.core.rest.parser.object,com.advantco.sugarcrm.core.rest.parser.xml,com.advantco.sugarcrm.core.rest.service,com.advantco.sugarcrm.core.result,com.advantco.sugarcrm.core.result.v10,com.advantco.sugarcrm.core.service,com.advantco.sugarcrm.core.util,com.advantco.sugarcrm.core.xml,javax.activation,javax.crypto,javax.crypto.spec,javax.mail,javax.xml.bind,javax.xml.parsers,javax.xml.stream,javax.xml.transform,javax.xml.transform.dom,javax.xml.transform.stream,org.apache.commons.codec.binary,org.apache.commons.collections4.map,org.apache.commons.httpclient,org.apache.commons.httpclient.util,org.json
我正在尝试这一点,但它似乎不工作的情况下,标题后面的进口包是在小案件。(这里是Import-Packge:package-names……需要Capability:later,但在某些情况下,它的Import-Packge:package-names……url:会被捕获。)
但是如果清单是这样的
Bnd-LastModified: 1494408636933
Bundle-ManifestVersion: 2
Import-Package: com.advantco.base,com.advantco.base.logging,com.advant
co.base.mime,com.advantco.base.net,com.advantco.base.variablesubstitu
tion,com.advantco.rest,com.advantco.rest.auth,com.advantco.rest.auth.
oauth2,com.advantco.sugarcrm.core,com.advantco.sugarcrm.core.adapter,
com.advantco.sugarcrm.core.error,com.advantco.sugarcrm.core.iface,com
.advantco.sugarcrm.core.object,com.advantco.sugarcrm.core.object.meta
data,com.advantco.sugarcrm.core.rest,com.advantco.sugarcrm.core.rest.
auth,com.advantco.sugarcrm.core.rest.metadata,com.advantco.sugarcrm.c
ore.rest.op,com.advantco.sugarcrm.core.rest.op.v10,com.advantco.sugar
crm.core.rest.parser,com.advantco.sugarcrm.core.rest.parser.object,co
m.advantco.sugarcrm.core.rest.parser.xml,com.advantco.sugarcrm.core.r
est.service,com.advantco.sugarcrm.core.result,com.advantco.sugarcrm.c
ore.result.v10,com.advantco.sugarcrm.core.service,com.advantco.sugarc
rm.core.util,com.advantco.sugarcrm.core.xml,javax.activation,javax.cr
ypto,javax.crypto.spec,javax.mail,javax.xml.bind,javax.xml.parsers,ja
vax.xml.stream,javax.xml.transform,javax.xml.transform.dom,javax.xml.
transform.stream,org.apache.commons.codec.binary,org.apache.commons.c
ollections4.map,org.apache.commons.httpclient,org.apache.commons.http
client.util,org.json
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.6))"
Tool: Bnd-3.3.0.201609221906
Export-Package: com.advantco.sugarcrm.core;uses:="com.advantco.base.lo
gging,com.advantco.sugarcrm.core.object";version="1.0.0",com.advantco
.sugarcrm.core.adapter;uses:="com.advantco.base,com.advantco.base.log
ging,com.advantco.base.net,com.advantco.base.variablesubstitution,com
.advantco.sugarcrm.core,com.advantco.sugarcrm.core.error,com.advantco
.sugarcrm.core.object,com.advantco.sugarcrm.core.object.metadata";ver
sion="1.0.0",com.advantco.sugarcrm.core.error;version="1.0.0",com.adv
antco.sugarcrm.core.iface;uses:="com.advantco.sugarcrm.core.error,com
.advantco.sugarcrm.core.object";version="1.0.0",com.advantco.sugarcrm
.core.object;uses:="com.advantco.base,com.advantco.base.mime,com.adva
ntco.base.net,com.advantco.sugarcrm.core.error,com.advantco.sugarcrm.
Bnd-LastModified: 1494408636933
Bundle-ManifestVersion: 2
Import-Package: com.advantco.base,com.advantco.base.logging,com.advant
co.base.mime,com.advantco.base.net,com.advantco.base.variablesubstitu
tion,com.advantco.rest,com.advantco.rest.auth,com.advantco.rest.auth.
oauth2,com.advantco.sugarcrm.core,com.advantco.sugarcrm.core.adapter,
com.advantco.sugarcrm.core.error,com.advantco.sugarcrm.core.iface,com
.advantco.sugarcrm.core.object,com.advantco.sugarcrm.core.object.meta
data,com.advantco.sugarcrm.core.rest,com.advantco.sugarcrm.core.rest.
auth,com.advantco.sugarcrm.core.rest.metadata,com.advantco.sugarcrm.c
ore.rest.op,com.advantco.sugarcrm.core.rest.op.v10,com.advantco.sugar
crm.core.rest.parser,com.advantco.sugarcrm.core.rest.parser.object,co
m.advantco.sugarcrm.core.rest.parser.xml,com.advantco.sugarcrm.core.r
est.service,com.advantco.sugarcrm.core.result,com.advantco.sugarcrm.c
ore.result.v10,com.advantco.sugarcrm.core.service,com.advantco.sugarc
rm.core.util,com.advantco.sugarcrm.core.xml,javax.activation,javax.cr
ypto,javax.crypto.spec,javax.mail,javax.xml.bind,javax.xml.parsers,ja
vax.xml.stream,javax.xml.transform,javax.xml.transform.dom,javax.xml.
transform.stream,org.apache.commons.codec.binary,org.apache.commons.c
ollections4.map,org.apache.commons.httpclient,org.apache.commons.http
client.util,org.json
url:http://sample.org
然后sample.org也会被捕获。编辑:因为OP告诉uri
字符串不应该硬编码,所以现在添加此解决方案
`sed -n -e '/Import-Package/,/[A-Z]/ p'`
awk '
/Import-Package/{
flag=1
val=$0
next
}
flag && /^ / && NF{
gsub(/^ /,"")
val=val?val $0:$0
next
}
flag && !/^ / && NF{
print val
flag=val=""
}' Input_file
输出如下
Import-Package: com.advantco.base,com.advantco.base.logging,com.advantco.base.mime,com.advantco.base.net,com.advantco.base.variablesubstitution,com.advantco.rest,com.advantco.rest.auth,com.advantco.rest.auth.oauth2,com.advantco.sugarcrm.core,com.advantco.sugarcrm.core.adapter,com.advantco.sugarcrm.core.error,com.advantco.sugarcrm.core.iface,com.advantco.sugarcrm.core.object,com.advantco.sugarcrm.core.object.metadata,com.advantco.sugarcrm.core.rest,com.advantco.sugarcrm.core.rest.auth,com.advantco.sugarcrm.core.rest.metadata,com.advantco.sugarcrm.core.rest.op,com.advantco.sugarcrm.core.rest.op.v10,com.advantco.sugarcrm.core.rest.parser,com.advantco.sugarcrm.core.rest.parser.object,com.advantco.sugarcrm.core.rest.parser.xml,com.advantco.sugarcrm.core.rest.service,com.advantco.sugarcrm.core.result,com.advantco.sugarcrm.core.result.v10,com.advantco.sugarcrm.core.service,com.advantco.sugarcrm.core.util,com.advantco.sugarcrm.core.xml,javax.activation,javax.crypto,javax.crypto.spec,javax.mail,javax.xml.bind,javax.xml.parsers,javax.xml.stream,javax.xml.transform,javax.xml.transform.dom,javax.xml.transform.stream,org.apache.commons.codec.binary,org.apache.commons.collections4.map,org.apache.commons.httpclient,org.apache.commons.httpclient.util,org.json
第一种解决方案:考虑到您的实际输入文件与所示示例相同,请尝试以下内容
awk '
/^uri/{
flag=""
}
/^Import/{
flag=1
}
flag{
sub(/^ +/,"")
val=val?val $0:$0
}
END{
print val
}' Input_file
第二种解决方案:在此处使用RS
添加解决方案
awk -v RS="uri:" 'FNR==1{gsub(/\n|\n +/,"");print}' Input_file
第三种解决方案:在此处同时使用RS
和FS
awk -v RS="" -v FS="uri:" '{gsub(/\n|\n +/,"",$1);print $1}' Input_file
第四个解决方案:使用将关键字与awk
匹配,再添加一个解决方案
awk -v RS="" -v FS="\n" 'match($0,/Import.*uri/){val=substr($0,RSTART,RLENGTH);gsub(/\n|\n +|uri$/,"",val);print val}' Input_file
注意:如果您只有一次打印这种类型的行,那么您可以在print
语句之后添加exit
。编辑:因为OP告诉uri
字符串不应该硬编码,所以现在添加此解决方案
awk '
/Import-Package/{
flag=1
val=$0
next
}
flag && /^ / && NF{
gsub(/^ /,"")
val=val?val $0:$0
next
}
flag && !/^ / && NF{
print val
flag=val=""
}' Input_file
输出如下
Import-Package: com.advantco.base,com.advantco.base.logging,com.advantco.base.mime,com.advantco.base.net,com.advantco.base.variablesubstitution,com.advantco.rest,com.advantco.rest.auth,com.advantco.rest.auth.oauth2,com.advantco.sugarcrm.core,com.advantco.sugarcrm.core.adapter,com.advantco.sugarcrm.core.error,com.advantco.sugarcrm.core.iface,com.advantco.sugarcrm.core.object,com.advantco.sugarcrm.core.object.metadata,com.advantco.sugarcrm.core.rest,com.advantco.sugarcrm.core.rest.auth,com.advantco.sugarcrm.core.rest.metadata,com.advantco.sugarcrm.core.rest.op,com.advantco.sugarcrm.core.rest.op.v10,com.advantco.sugarcrm.core.rest.parser,com.advantco.sugarcrm.core.rest.parser.object,com.advantco.sugarcrm.core.rest.parser.xml,com.advantco.sugarcrm.core.rest.service,com.advantco.sugarcrm.core.result,com.advantco.sugarcrm.core.result.v10,com.advantco.sugarcrm.core.service,com.advantco.sugarcrm.core.util,com.advantco.sugarcrm.core.xml,javax.activation,javax.crypto,javax.crypto.spec,javax.mail,javax.xml.bind,javax.xml.parsers,javax.xml.stream,javax.xml.transform,javax.xml.transform.dom,javax.xml.transform.stream,org.apache.commons.codec.binary,org.apache.commons.collections4.map,org.apache.commons.httpclient,org.apache.commons.httpclient.util,org.json
第一种解决方案:考虑到您的实际输入文件与所示示例相同,请尝试以下内容
awk '
/^uri/{
flag=""
}
/^Import/{
flag=1
}
flag{
sub(/^ +/,"")
val=val?val $0:$0
}
END{
print val
}' Input_file
第二种解决方案:在此处使用RS
添加解决方案
awk -v RS="uri:" 'FNR==1{gsub(/\n|\n +/,"");print}' Input_file
第三种解决方案:在此处同时使用RS
和FS
awk -v RS="" -v FS="uri:" '{gsub(/\n|\n +/,"",$1);print $1}' Input_file
第四个解决方案:使用将关键字与awk
匹配,再添加一个解决方案
awk -v RS="" -v FS="\n" 'match($0,/Import.*uri/){val=substr($0,RSTART,RLENGTH);gsub(/\n|\n +|uri$/,"",val);print val}' Input_file
注意:如果您只有一次打印此类行,那么您可以在上述两种代码的打印
语句之后添加退出
。我的假设:
- “导入包:”可以从文件中间开始。
- 下一个属性并不总是“uri”
那么:
awk '/^Import-Package:/,!/^Import-Package:/&&!/^ / {
if (!line || sub(/^ /, "")) line = line $0}
END {print line}
' sample.txt
它从“Import Package:”行读取,直到下一个属性的行(被丢弃),通过删除前导空格来连接这些行。我的假设:
- “导入包:”可以从文件中间开始。
- 下一个属性并不总是“uri”
那么:
awk '/^Import-Package:/,!/^Import-Package:/&&!/^ / {
if (!line || sub(/^ /, "")) line = line $0}
END {print line}
' sample.txt
它从“Import Package:”行读取,直到下一个属性的行(被丢弃),通过删除前导空格连接行。大量awk
响应,但这在sed
中也是完全可行的
如果您只想按原样打印块:
它们可以在GNUsed
中堆叠在一行上
$: sed -n '/^Import-Package: /,/^[^ ]/ { /^Import-Package:/ p; /^ / p; }' infile
解释
使用sed
和-n
防止任何输出,除非通过显式命令;从(本例中)名为infle
的文件中读取,根据需要进行调整。在单引号中,程序读取:
/^Import-Package: /,/^[^ ]/ {
/^Import-Package:/ p;
/^ / p;
}
从以Import Package:
开头的任何行开始,并继续执行以任何非空格(此处显式为空格字符)开头的任何后续行,执行从该左大括号开始的所有命令,直到匹配的右大括号结束
在该块中,对于以Import Package:
开头的任何行,打印它。对于任何以空格开头的行,请打印它
没有命令可以打印以非导入包:
的非空格开头的任何行,因此如果在该行下方有另一个块开始,它将不会打印该块,并且切换将超出范围,因此除非另一个导入包:
块开始,否则它不会打印任何其他内容
如果块结束文件,代码范围将永远不会超出范围,因此它将一直打印到记录用完为止
如果希望它在一行上打印块,并删除空格-
对于从/^Import Package://
到任何非空格第一个字符的行
- 如果行以Import Package开头:
将保留空间替换为它,并将其从模式空间中删除以触发下一次读取
如果该行以空格开头,请将其添加到保留空格中
如果一行以非空格开头,用s/*/
擦洗它;其余部分也适用于最后一行($
),因此在这两种情况下,x
将累积的保留空间放回模式空间(从技术上讲,它会交换它们),s/\n*//g
将所有换行空间序列替换为零(删除它们),p
打印该行,并且d
删除它,作为一个干净的缓冲区,以开始下一个循环(该循环在文件末尾退出)
剩下的都是不必要的选择
。。。但是自从我第一次把请求放在cas时就误读了