linux 如何检查(并删除)最后一行(包含字符串的最后一次出现)是否有逗号作为最后一个字符?

643ylb08  于 2023-05-06  发布在  Linux
关注(0)|答案(5)|浏览(289)

我在网上到处找,但没有结果。
我正在尝试构建一个包生成器(在shell/bash中),并且相应的包包含(一个或多个)json文件。当浏览json文件时,如果用户想要删除其中一个步骤,我必须首先考虑如果他想要删除的步骤是最后一个步骤。如果是这样,最后一步的前一步将包含逗号,但json格式不允许这样做。

{
  "operation_machinetype": "Ford",
  "operation_steps": [
    "steps/Step_1/01_paint_the_car.json",
    "steps/Step_2/01_drive_the_car.json",
    "steps/Step_2/02_park_the_car.json"
  ]
}

例如,如果我删除'“steps/Step2/02_park_the_car.json”',那么'“steps/Step2/01_drive_the_car.json”,'将是最后一步,但逗号将导致错误。
提前感谢大家。

qlfbtfca

qlfbtfca1#

$ cat tst.awk
index($0,tgt) {
    if (!/,[[:space:]]*$/) {
        sub(/,[[:space:]]*$/,"",prev)
    }
    next
}
NR>1 { print prev }
{ prev = $0 }
END { print prev }

$ awk -v tgt='"steps/Step_2/02_park_the_car.json"' -f tst.awk file
{
  "operation_machinetype": "Ford",
  "operation_steps": [
    "steps/Step_1/01_paint_the_car.json",
    "steps/Step_2/01_drive_the_car.json"
  ]
}

$ awk -v tgt='"steps/Step_2/01_drive_the_car.json"' -f tst.awk file
{
  "operation_machinetype": "Ford",
  "operation_steps": [
    "steps/Step_1/01_paint_the_car.json",
    "steps/Step_2/02_park_the_car.json"
  ]
uz75evzq

uz75evzq2#

我知道类别是bash,但你可能应该使用一些JSON感知的东西,而不仅仅是编辑文件,就像它是基于行的一样。这样你就不必担心正确的json编码,而是可以专注于操作数据。我倾向于使用Python,因为内置的JSON支持和相对的普遍性(因为这在Python中非常简单)。也许类似于这个简单的脚本(其中一半以上是错误检查):

#!/bin/env python
import json
import sys

if( len(sys.argv)-1 != 2 ):
  sys.stdout.write('Usage: ' + sys.argv[0] + ' pattern file\n')
  sys.exit(1)

patt = sys.argv[1]
filename = sys.argv[2]

with open(filename, 'r') as data_file:
  data = json.load(data_file)

try:
  data["operation_steps"].remove(patt)
except ValueError:
  sys.stdout.write( 'Pattern "' + patt + '" not found in '
                    + filename + '; leaving file unchanged\n' )
  sys.exit(2)

sys.stdout.write( 'updating ' + filename + '\n' )
with open(filename, 'w') as data_file:
  json.dump(data, data_file, ensure_ascii=False, indent=2)

如果你从json.dump调用中去掉“indent=2”,它也会压缩json--这可能有助于减少包中浪费的空间。:)
有几个命令行json操作器,我一直在为ksh 93编写一个基于C的可加载模块,但如果我今天要这样做的话,这就是我实际上解决问题的方法。

pwuypxnk

pwuypxnk3#

这可能对你有用(GNU sed):

sed 'N;s#,\s*\n\s*"steps/Step_2/02_park_the_car\.json"##;P;D' file

它一次读取两行,如果找到匹配项,则删除所需的字符串。它先打印,然后删除第一行,再追加下一行。
注意:如果模式空间为空,则读取另一行,然后追加下一行。

91zkwejq

91zkwejq4#

您可以使用多行正则表达式查找右括号前的最后一个逗号,例如:

/,\s*]/g
fruv7luv

fruv7luv5#

您可以考虑使用YAML:

---
  operation_machinetype: "Ford"
  operation_steps: 
    - "steps/Step_1/01_paint_the_car.json"
    - "steps/Step_2/01_drive_the_car.json"
    - "steps/Step_2/02_park_the_car.json"

相关问题