【发布时间】:2021-10-28 03:12:12
【问题描述】:
我有以下 sn-p 文件,dbScripts/product.js:
db.ShoppingCart.update(
{ 'identifier': 'COFFEE' },
{
'name': 'Coffee',
'identifier': 'COFFEE',
'category': 'Beverages',
'type': [
{
'name': 'Rage',
'identifier': 'COFFEE_RAGE',
'desc':
'Coffee by Rage'
},
{
'name': 'Sleepy Owl',
'identifier': 'COFFEE_SLEEPY_OWL',
'desc':
'Coffee by Sleepy Owl'
}
]
},
{ upsert: true }
);
我希望先匹配 {'identifier': 'COFFEE'},如果存在,然后再寻找下一个后续模式 'type': [
如果两个条件都满足,代码应该为其他咖啡品牌插入类似的对象。但是,如果输入的标识符不是咖啡,它将为其创建整个结构。 【后半部分已经完成】。
FILE_PATH="./dbScripts/products.js"
# example, COFFEE
echo "Enter product"
read -r PRODUCT_NAME
DESCRIPTION="Coffee by Nescafe"
IDENTIFIER="COFFEE_NESCAFE"
FOUND=$(awk -v ITEM="{ \'identifier\': \'${PRODUCT_NAME}\' }" 'BEGIN {FOUND=0}/ITEM/{++FOUND} END {print FOUND+0}' "${FILE_PATH}")
echo ${FOUND}
if [ ${FOUND} -eq 1 ]; then
SCRIPT_TEMPLATE="./AutomationUtil/object.tpl"
local SCRIPT=$(eval "echo \"$(cat "${SCRIPT_TEMPLATE}")\"")
awk -v text="${SCRIPT}" '1;/'type': | 'types': /{printf text}' "${FILE_PATH}" > "${FILE_PATH}_tmp" && mv "${FILE_PATH}_tmp" "${FILE_PATH}"
fi
我正在尝试使用 awk-variable FOUND 作为标志来检查是否找到了模式。当且仅当 FOUND=1
时,继续下一个模式对象.tpl
{'name': '${PRODUCT_NAME}','identifier': '${PRODUCT_IDENTIFIER}','desc':'${DESCRIPTION}'},
因此,如果找到两个后续模式,则将评估并插入上述模板。如果没有,来自 dbScripts/product.js 的整个对象结构将在文件末尾创建,例如,用户输入 Tea 而不是 Coffee。
在下面的示例中,用户输入 COFFEE 作为标识符,它与我们的第一个模式 {'identifier': 'COFFEE'} 匹配,然后它找到行,'type': [,并在其下方插入评估的 Object.tpl .
预期输出:
db.ShoppingCart.update(
{ 'identifier': 'COFFEE' },
{
'name': 'Coffee',
'identifier': 'COFFEE',
'category': 'Beverages',
'type': [
{
'name': 'Nescafe',
'identifier': 'COFFEE_NESCAFE',
'desc':
'Coffee by Nesafe'
},
{
'name': 'Rage',
'identifier': 'COFFEE_RAGE',
'desc':
'Coffee by Rage'
},
{
'name': 'Sleepy Owl',
'identifier': 'COFFEE_SLEEPY_OWL',
'desc':
'Coffee by Sleepy Owl'
}
]
},
{ upsert: true }
);
db.ShoppingCart.update(
{ 'identifier': 'NOODLES' },
{
'name': 'Noodles',
'identifier': 'NOODLES',
'category': 'Instant Food',
'type': [
{
'name': 'Ramen',
'identifier': 'NOODELS_RAMEN',
'desc':
'Noodles by Ramen'
}
]
}, {upsert: true}
);
我从理论上想出了这个,但似乎无法让它发挥作用。我总是得到 FOUND=0。
我敢肯定,这段代码非常愚蠢,但感谢任何帮助。同样,为了插入对象,应该找到这两种模式。
注意:格式由 prettier 处理,因此在插入新文本时应忽略间距
我不想使用 SED,因为 MacOS 不附带 GNU-SED。
awk 版本 20200816
【问题讨论】:
-
关于
spacing can be ignored- 如果我们必须解决所有可能的空白问题,那么工作会变得更加困难,所以说间距可以被忽略是错误的思考方式这。要么间距必须被忽略,要么间距可以被依赖。哪个是正确的? -
考虑用足够的细节更新问题,以便我们可以在自己的环境中重现工作;特别是,提供所有
$variables的值、*tpl 文件的内容(要插入;如果文件是“大”,那么文件的较小样本就足够了),以及预期的结果;另外,请使用在您的系统上运行awk --version的输出更新问题 -
@EdMorton 注意到了! Prettier 正在根据其配置格式化代码。所以间距应该被忽略。
-
@markp-fuso 我已尝试详细说明并添加上下文,如果仍然缺少,请告诉我
-
再次 -
spacing should be ignored是否意味着您需要一个不依赖于问题中间距的脚本(例如,所有输入都可能是一行)?