2016-01-21 259 views
0

我有下面的代码块:如何使用awk/sed在两行之间添加一行新文本? (在文件中)

{ 
    "operation_machine": "Ford", 
    "operation_steps": [ 
    "steps/Step_1/01_paint_the_car.json", 
    "steps/Step_2/01_drive_the_car.json", 
    "steps/Step_2/02_park_the_car.json" 
    ] 
} 

我想在线x和y之间的列表中添加一个新行(步骤)。我说,如果我需要增加行动数字“2”(字符串= wax_the_car)步骤用于“1”会看看到底这样的:

{ 
    "operation_machine": "Ford", 
    "operation_steps": [ 
    "steps/Step_1/01_paint_the_car.json", 
    "steps/Step_1/02_wax_the_car.json", 
    "steps/Step_2/01_drive_the_car.json", 
    "steps/Step_2/02_park_the_car.json" 
    ] 
} 

我刚坐进AWK,但我想我需要在我可以自己做这件事之前10次阅读这本书。 我需要你的帮助男生/女生。

+0

为什么要使用文本处理工具来编辑JSON?为什么不使用JSON处理工具呢? –

+0

因为这是我必须去做的环境。 :) –

回答

2

awk来救援!

$ awk '/Step_2\/01/{print ">>> new line here <<<"}1' file 
{ 
    "operation_machine": "Ford", 
    "operation_steps": [ 
    "steps/Step_1/01_paint_the_car.json", 
>>> new line here <<< 
    "steps/Step_2/01_drive_the_car.json", 
    "steps/Step_2/02_park_the_car.json" 
    ] 
} 
+0

不知道为什么,但这只会打印没有插入任何换行符的块的旧版本。 :( –

+0

它只会在模式“Step_2/01”之前插入行,如果你的数据文件没有这行,它不会打印任何额外的内容,你可以用任何其他独特的模式替换它。 – karakfa

1

sed一个天真的用法是如下:

sed -i '/text you know is there/ a the line you want to beneath it' file 

在您的例子:

sed -i '/paint_the_car/ a "steps/Step_1/02_wax_the_car.json",' file 

这个例子需要GNU sed

如果你想自动生成格式,a并不适合,因为它没有注意到匹配的行,并且你不能真正意识到它。 这工作,但并不像第一个为小事:

sed -i '/paint_the_car/ s_\([ \t]*\).*_&\n\1"steps/Step_1/02_wax_the_car.json",_' file 

\(something\)将匹配东西并且以后可以用\1引用。 &将引用替换命令的第一部分中匹配的整个字符串。

+0

还有一种方法可以自动格式化该行吗? :) –

+0

当然你可以使用* ANSI C引用*来编写标签,就像tabstop之后的'$'字\ tword一样。但是自动生成并不像这样微不足道。要获得更为复杂的答案,请参阅我编辑的anwer。 – hgiesel

+0

谢谢你,对于迟到的答案感到抱歉! –

1

如果你想用awk可以做到以下几点:

awk '/steps\/Step\_1\/01\_paint\_the\_car\.json/{print $0 `RS` " \"line1\"" RS " \"line2\"";next}1' input_file 

解释

首先,你匹配的模式'/pattern/',然后打印当前行print $0。使用RS(记录分隔符,默认值为新行),您告诉要插入一个新行,然后添加将由于最终1而打印的实际新行。 next跳过已打印的行。

记得保护/,_,.这是awk模式匹配/patter/中的特殊字符。

还要注意空格:

" \"new line1" 
^^^^ 

要调整格式。您还可以使用\t:“\tnew line1”通过选项卡自动格式化。

然后,你必须保存awk命令的结果:

awk 'command above' > out_file 
1

这可能会为你工作(GNU SED):

sed '\#"steps/Step_2/01_drive_the_car\.json"#{p;s##"steps/Step_1/02_wax_the_car.json"#}' file 

匹配的字符串,打印,替换字符串并打印结果。

N.B. \#...#使用#作为匹配分隔符(当使用替代命令s/.../.../时,不需要引用第一个分隔符)。此外,空匹配使用最后一个是默认值。最后,在比赛中的元字符,应即引述.[]等应\.\[\]