我有的文本是
"Example": "Example2",
"What": "Huh",
"Really": "yes",
“” 内的文本始终会发生变化,但其他内容始终保持不变。我需要将其放入以下格式:
"Example2": {
"Name": "Example",
},
"Huh": {
"Name": "What",
},
"yes": {
"Name": "Really",
},
这里是一样的。“”内的文本始终会发生变化,但其余部分保持不变。您可能已经注意到,文本也会反转,这意味着前面的“示例”现在在后面,反之亦然。您知道如何自动化此过程吗?
我的操作系统:macOS、Kali Linux 和 Win11
注意:引号表示字符串,因为这将用于编程,它们只是用来告诉计算机这是一个字符串,它们可以从原始形式转换为第二种形式,也可以一直处于第二种形式,这其实并不重要。此外,只有字母、( )、- 、_ 、点和逗号可以出现在“”内的文本中。
到目前为止我尝试过什么:当我尝试用谷歌搜索时,我发现只有格式(如斜体、粗体等)不是我想要的东西,这意味着我甚至不知道从哪里开始,不知道我需要/想要使用的工具,并且除了 zapier formater 之外没有尝试过任何工具
答案1
以下sed
命令将识别每个输入行的前两个双引号字符串并以所需的格式输出它们:
<input_file sed 's#[^"]*"\([^"]*\)"[^"]*"\([^"]*\)".*#"\2": {\n\t\t"Name": "\1",\n\t},#'
注释(如果您出于任何原因想要修改解决方案则很有用):
我使用制表符 (
\t
) 进行缩进。如果需要,请用空格代替。*
是贪婪的,但[^"]
意味着“除 之外的任何字符"
”。实际上,代码捕获前两个带引号的字符串。其余的输入语法无关紧要。通过使用.*
而不是 ,[^"]*
您可以捕获最后的两个引用的字符串:<input_file sed 's#.*"\(.*\)".*"\(.*\)".*#"\2": {\n\t\t"Name": "\1",\n\t},#'
对于所讨论的示例,这同样有效,但概念上有所不同。尽管此版本作为
sed
代码更简单,但我更喜欢原始解决方案。原因是:如果输入格式被扩展并允许额外的(可能是可选的)双引号字符串,则额外的字段可能会出现在已定义的字段之后。代码将[^"]*
是兼容的使用扩展格式(在设计用于处理的两个字段范围内)。.*
如果通过在前面添加字段来扩展格式,代码会更好,但这似乎不太可能。我可以将引号包含在捕获组中,这样替换代码会稍微短一些(例如,
\2:
而不是"\2":
)。我决定不这样做,因为我发现引号属于语法,而不是数据。我的正则表达式抽象输入数据,而不涉及任何与语法相关的东西。这种方法有一些优雅之处。现在我可以通过调整替换部分s
(不触及正则表达式)来构建任何输出格式。
答案2
利用这些信息,使用 bash 终端并使用awk
awk '{print $3, "\:"}{print "\{name\:", $1,"\},"}' file.txt > file.json
样本testjason.txt
"example" : "answer",
"what" : "huh",
"really" "yes",
输出
这是有效的,因为awk
处理 as 数组中的行,file.txt
因此您可以使用访问它们$n
。花括号{}
会创建一个上下文,在本例中,您可以在其中使用内置命令print
,除了使用变量之外,您还可以使用字符串,有些需要使用\
like进行转义\"
,因为它们是运算符。
最后,>
bash 操作符将输出重定向到当前工作目录中的新文件