Regex Perl正则表达式一行程序工作不正常

Regex Perl正则表达式一行程序工作不正常,regex,bash,perl,Regex,Bash,Perl,我尝试在bash脚本中对文件执行以下操作: 之前: { "main": "3.3.0", "archive":[ "3.2.2" ] } 之后: { "main": "3.3.1", "archive":[ "3.3.0", "3.2.2" ] } 使用此perl一行程序: perl -pi -e "s/\"main\"\: \"(.*?)(\".*)\[/\"main\": \"${versio

我尝试在bash脚本中对文件执行以下操作:

之前:

{
    "main": "3.3.0",
    "archive":[
        "3.2.2"
    ]
}
之后:

{
    "main": "3.3.1",
    "archive":[
        "3.3.0",
        "3.2.2"
    ]
}
使用此perl一行程序:

perl -pi -e "s/\"main\"\: \"(.*?)(\".*)\[/\"main\": \"${version}\2\[\n\t\t\"\1\",/s" "$json"
其中,
$version
保存新的版本号,
$json
是文件的路径

perl似乎不匹配,我不明白为什么。删除
\[
确实匹配,但我看不出该文字有什么问题。

(现在这个问题已经重新打开,我可以发布答案了。)

假设您修复了数据,使其成为有效的JSON(注意尾随的逗号无效),这是一个简单的单行程序:

$ jq "{main: \"$version\", archive: [ .main, .archive[] ]}" "$json" > new.json
$ mv -f new.json "$json"
与HTML和XML一样,使用正则表达式试图操作JSON是一个错误。请使用更合适的工具。

(现在,这个问题已经重新打开,我可以发布答案了。)

假设您修复了数据,使其成为有效的JSON(注意尾随的逗号无效),这是一个简单的单行程序:

$ jq "{main: \"$version\", archive: [ .main, .archive[] ]}" "$json" > new.json
$ mv -f new.json "$json"

与HTML和XML一样,使用正则表达式试图操纵JSON是一个错误。请使用更合适的工具。

假设您可以修复JSON(不允许使用尾随逗号),我建议使用模块和脚本来处理此问题

例如,如有要求,用“一”行线包裹

perl -MPath::Tiny -MJSON -0777 -wnE'
    my $hr = decode_json $_; 
    unshift @{$hr->{archive}}, $hr->{main}; 
    $hr->{main} =~ s/[0-9]+\.[0-9]+.\K([0-9]+)/$1+1/e; 
    path("new_".$ARGV)->spew(encode_json $hr)' 
' data.json
非常方便的方法用于轻松转储JSON输出。我通过在输入文件名(中提供)前加前缀
new
来生成输出文件名,并根据需要进行调整

如果由于某种原因安装模块是一个问题,您可以只打印JSON编码的字符串并重定向输出

perl -MJSON -0777 -wnE'
    my $hr = decode_json $_; 
    unshift @{$hr->{archive}}, $hr->{main}; 
    $hr->{main} =~ s/[0-9]+\.[0-9]+.\K([0-9]+)/$1+1/e; 
    say encode_json $hr 
' data.json > new_data.json
这些文件生成带有 
{“archive”:[“3.3.0”,“3.2.2”],“main”:“3.3.1”}

使用
-0777
将整个文件“slurp”成一个标量(
$),
-M…
加载给定的模块。然后我们使用
解码json
,默认情况下在其功能接口中导出
json
,以获得一个包含数据的hashref

然后使用将
main
的当前值添加到
archive
中arrayref的开头,然后使用正则表达式将其版本号/补丁号增加以进行更改

最后,
encode_json
,也在
json
的功能接口中导出,用于对hashref进行json编码,hashref通过
Path::Tiny
转储到文件或STDOUT以进行重定向


根据Grinnz的评论,关于现有JSON模块数量的一个词是有序的

上面的链接将加载该模块,如果没有安装该模块,那么它将返回到兼容的纯Perl模块。我建议使用XS模块,该模块速度更快,并且已被广泛使用

另一个选择是,带有bug跟踪器的
JSON::XS
fork和一个错误列表。我很高兴地使用了这两个工具,没有任何问题

要按顺序尝试这些方法,请使用


请注意,这些都不在核心中。

假设您可以修复JSON(不允许使用尾随逗号),我建议使用模块和脚本来处理

例如,如有要求,用“一”行线包裹

perl -MPath::Tiny -MJSON -0777 -wnE'
    my $hr = decode_json $_; 
    unshift @{$hr->{archive}}, $hr->{main}; 
    $hr->{main} =~ s/[0-9]+\.[0-9]+.\K([0-9]+)/$1+1/e; 
    path("new_".$ARGV)->spew(encode_json $hr)' 
' data.json
非常方便的方法用于轻松转储JSON输出。我通过在输入文件名(中提供)前加前缀
new
来生成输出文件名,并根据需要进行调整

如果由于某种原因安装模块是一个问题,您可以只打印JSON编码的字符串并重定向输出

perl -MJSON -0777 -wnE'
    my $hr = decode_json $_; 
    unshift @{$hr->{archive}}, $hr->{main}; 
    $hr->{main} =~ s/[0-9]+\.[0-9]+.\K([0-9]+)/$1+1/e; 
    say encode_json $hr 
' data.json > new_data.json
这些文件生成带有 
{“archive”:[“3.3.0”,“3.2.2”],“main”:“3.3.1”}

使用
-0777
将整个文件“slurp”成一个标量(
$),
-M…
加载给定的模块。然后我们使用
解码json
,默认情况下在其功能接口中导出
json
,以获得一个包含数据的hashref

然后使用将
main
的当前值添加到
archive
中arrayref的开头,然后使用正则表达式将其版本号/补丁号增加以进行更改

最后,
encode_json
,也在
json
的功能接口中导出,用于对hashref进行json编码,hashref通过
Path::Tiny
转储到文件或STDOUT以进行重定向


根据Grinnz的评论,关于现有JSON模块数量的一个词是有序的

上面的链接将加载该模块,如果没有安装该模块,那么它将返回到兼容的纯Perl模块。我建议使用XS模块,该模块速度更快,并且已被广泛使用

另一个选择是,带有bug跟踪器的
JSON::XS
fork和一个错误列表。我很高兴地使用了这两个工具,没有任何问题

要按顺序尝试这些方法,请使用


请注意,这些都不在核心中。

使用
jq
main
版本号移动到阵列
archive
并增加
main
版本的最后一位:

jq '.archive += [.main] |
    .main |= (split(".") | .[-1] |= (tonumber+1|tostring) | join("."))' file
运算符
+=
将一个新值添加到数组
存档


运算符
|=
main
分配一个新值。拆分字符串的最后一个元素递增1,然后重新组合。

使用
jq
main
版本号移动到数组
archive
并递增
main
版本的最后一位:

jq '.archive += [.main] |
    .main |= (split(".") | .[-1] |= (tonumber+1|tostring) | join("."))' file
运算符
+=
将一个新值添加到数组
存档


运算符
|=
main
分配一个新值。拆分字符串的最后一个元素递增1,然后重新组合。

@WiktorStribiżew这是一个快速关闭