![匹配后在 n 行上编辑 sed/awk/perl 文本](https://linux22.com/image/1593639/%E5%8C%B9%E9%85%8D%E5%90%8E%E5%9C%A8%20n%20%E8%A1%8C%E4%B8%8A%E7%BC%96%E8%BE%91%20sed%2Fawk%2Fperl%20%E6%96%87%E6%9C%AC.png)
我为此苦苦挣扎。我试图编辑匹配后的接下来 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 文件。不要将它们视为文本文件。