我为此苦苦挣扎。我试图编辑匹配后的接下来 6 行,方法是在每行前添加文本,并在每行现有数字前后添加双引号。
我的文件是这样的:
"data": [
4,
15,
43,
10,
60,
45
我想要得到的输出是:
"data": [
"stuff": "4",
"stuff": "15",
"stuff": "20",
"stuff": "13",
"stuff": "4",
"stuff": "25",
我已经尝试过这个:
sed '/"data"/{N;N;N;N;N;s/\([0-9][0-9]\)/"stuff": "\1"/}'
但似乎只能编辑匹配后的第二行。我不是专家,所以我搞不懂。任何想法/帮助都将不胜感激。
答案1
代码修复:
sed '/"data"/{N;N;N;N;N;N;s/\([0-9][0-9]*\)/"stuff": "\1"/g}'
测试运行:
$ sed '/"data"/{N;N;N;N;N;N;s/\([0-9][0-9]*\)/"stuff": "\1"/g}' input.txt
"data": [
"stuff": "4",
"stuff": "15",
"stuff": "43",
"stuff": "10",
"stuff": "60",
"stuff": "45"
解释:
您跳过第一行是因为您要搜索的是两位数,但4
只有一位数字。如果您希望替换所有出现的数字,则应添加g
(global) 修饰符。最后,为了包含最后一行,请再添加一个N;
选择:这是一个稍微更健壮和通用的 Perl:
perl -lape 's/([0-9]+)/"stuff": $1/ if /"data"/../]/'
选择:您可以编辑输入文件使其变得“平坦”,然后以多种方式之一进行转换。
更好的选择:使用jq
或其他专门的工具/库来转换 JSON 文件。不要将它们视为文本文件。