匹配后在 n 行上编辑 sed/awk/perl 文本

匹配后在 n 行上编辑 sed/awk/perl 文本

我为此苦苦挣扎。我试图编辑匹配后的接下来 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 文件。不要将它们视为文本文件。

相关内容