Bash 如果与前一行匹配,则使用awk提取特定模式

Bash 如果与前一行匹配,则使用awk提取特定模式,bash,awk,Bash,Awk,我有以下文件: [INFO] com.fasterxml.jackson.core:jackson-core ............. 2.10.4 -> 2.11.0 [INFO] com.fasterxml.jackson.core:jackson-databind ......... 2.10.4 -> 2.11.0 [INFO] com.fasterxml.jackson.dataformat:jackson-dataformat-avro ... [INFO]

我有以下文件:

[INFO]   com.fasterxml.jackson.core:jackson-core ............. 2.10.4 -> 2.11.0
[INFO]   com.fasterxml.jackson.core:jackson-databind ......... 2.10.4 -> 2.11.0
[INFO]   com.fasterxml.jackson.dataformat:jackson-dataformat-avro ...
[INFO]                                                         2.10.4 -> 2.11.0
[INFO]   com.fasterxml.jackson.dataformat:jackson-dataformat-cbor ...
[INFO]                                                         2.10.4 -> 2.11.0
最后我想说的是:

com.fasterxml.jackson.core:jackson-core@2.10.4 -> 2.11.0
com.fasterxml.jackson.core:jackson-databind@2.10.4 -> 2.11.0
com.fasterxml.jackson.dataformat:jackson-dataformat-avro@2.10.4 -> 2.11.0
com.fasterxml.jackson.dataformat:jackson-dataformat-cbor@2.10.4 -> 2.11.0
我怎样才能做到这一点

正在删除[信息]并替换。。。使用@非常简单,即

cat temp1 | sed "s/\[INFO\]//g" | sed "s/\s//g" | sed -E "s/\.\.+/@/"
其中包括:

com.fasterxml.jackson.core:jackson-core@2.10.4->2.11.0
com.fasterxml.jackson.core:jackson-databind@2.10.4->2.11.0
com.fasterxml.jackson.dataformat:jackson-dataformat-avro@
2.10.4->2.11.0
com.fasterxml.jackson.dataformat:jackson-dataformat-cbor@
2.10.4->2.11.0
然而,我不知道如何使用awk来获得带有->的所有行,但是如果该行没有。。。然后获取上一个+当前,否则仅获取当前


感谢使用
awk
解决OP的
cat/sed/sed/sed
步骤后的“下一步”

出于测试目的:

$ cat com.data
com.fasterxml.jackson.core:jackson-core@2.10.4->2.11.0
com.fasterxml.jackson.core:jackson-databind@2.10.4->2.11.0
com.fasterxml.jackson.dataformat:jackson-dataformat-avro@
2.10.4->2.11.0
com.fasterxml.jackson.dataformat:jackson-dataformat-cbor@
2.10.4->2.11.0
一个
awk
解决方案:

awk '
BEGIN  { pfx="" }                                       # initial printf prefix is empty string

/^com/ { printf "%s%s", pfx, $0 ; pfx="\n" ; next }     # if line starts with "^com" then print prefix and current line
                                                        # set prefix to "\n" for rest of script
                                                        # skip to next line of input

       { printf "%s", $0 }                              # otherwise printf current line

END    { printf "\n" }                                  # print one last "\n" once done
' com.data
注意:删除对分离器代码的注释

上述情况产生:

com.fasterxml.jackson.core:jackson-core@2.10.4->2.11.0
com.fasterxml.jackson.core:jackson-databind@2.10.4->2.11.0
com.fasterxml.jackson.dataformat:jackson-dataformat-avro@2.10.4->2.11.0
com.fasterxml.jackson.dataformat:jackson-dataformat-cbor@2.10.4->2.11.0
OP应能够通过以下方式实现这一点:

cat temp1 | sed "s/\[INFO\]//g" | sed "s/\s//g" | sed -E "s/\.\.+/@/" | awk 'BEGIN ... '


就个人而言,我可能会放弃整个
cat/sed/sed/sed
块,转而使用单个
awk
解决方案(例如,Ed的答案)。

您使用了哪个示例?因为NF是字段数,在删除所有[INFO]之后。。。NF始终是1我需要一个通用的solution@Symeon如果您需要一个通用解决方案,请正确描述输入。这个脚本与您的示例配合得很好是的…您是对的…它只是用于起始文件。谢谢
cat temp1 | sed "s/\[INFO\]//g" | sed "s/\s//g" | sed -E "s/\.\.+/@/" | awk 'BEGIN ... '