我的文件夹中有一些文件
每个文件都有这样的结构:
...
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 键行上。