SED - 如果找到一个或另一个匹配,则创建新行

SED - 如果找到一个或另一个匹配,则创建新行

我的文件夹中有一些文件

每个文件都有这样的结构:

...
infos: '{"NAME":"Product","CLASSES":[255,107,255,108,255,255,0,0,255,255,255,255,255],"ISSALE":0,"CATEG":54}'
warehouse: 123
color: black
...

我需要完成以下场景使用单个 SED 命令,在所有使用 *.txt 的文件中

仅当发生两种情况之一时,我才需要创建一个新行。如果匹配 2 个条件,则必须仅生成一行

状况:

信息:{...xxxx...."CATEG":54} 或仓库:123

PS:我没有行号,因为行号可能会更改文件。 PS2:我不知道 CATEG 在 {} 内的位置,因为“CLASSES”可能会按文件更改大小,如下所示

匹配 CATEG - 已创建 1 条线

...
infos: '{"NAME":"Product","CLASSES":[255,107,255,108,255,255,0,0,255,255,255,255,255],"ISSALE":0,"CATEG":54}'
warehouse: 000
NEW LINE
color: black
...

匹配仓库 - 创建 1 行

...
infos: '{"NAME":"Product","CLASSES":[255,107,255,108,255,255,0,0,255,255,255,255,255],"ISSALE":0,"CATEG":00}'
warehouse: 123
NEW LINE
color: black
...

匹配 CATEG 和仓库 - 创建 1 行

...
infos: '{"NAME":"Product","CLASSES":[255,107,255,108,255,255,0,0,255,255,255,255,255],"ISSALE":0,"CATEG":54}'
warehouse: 123
NEW LINE
color: black
...

不匹配 - 未创建任何行

...
infos: '{"NAME":"Product","CLASSES":[255,107,255,108,255,255,0,0,255,255,255,255,255],"ISSALE":0,"CATEG":00}'
warehouse: 000
color: black
...

答案1

我相信您知道它sed不理解数据的结构json。它所知道的只是换行符、字符串和正则表达式来选择和/或修改它们。

因此,很容易出错,更糟糕的是,您甚至不会知道这一点,因为 sed 会很乐意进行更改,直到下游很久以后。

除了注意事项之外,您可以尝试使用以下方法来解决此问题POSIX sed:

sed -e '

  $!N

  /^infos:.*\nwarehouse:/! {
    P
    D
  }

  /"CATEG":[1-9]/! {
    /\nwarehouse: *[1-9]/! b
  }

  G

' file

此外,如果您已GNU sed安装(很可能名为gsed),则可以使用 OR|运算符对其进行优化:

sed -E '$!N
  /^infos:|\nwarehouse:/!{P;D;}
  /("CATEG":|^warehouse:\s*)[1-9]/MG
' file

假设:

  • 信息线和仓库线相邻。
  • CATEG 键位于 infos 键行上。

相关内容