Regex Perl正则表达式一行程序工作不正常
我尝试在bash脚本中对文件执行以下操作: 之前: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
{
"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这是一个快速关闭