我有以下代码块:
{
"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行之间的列表中添加一个新行(步骤)。比方说,如果我需要为步骤“1”添加动作号“2”(string = wax_the_car),它最终会像这样:
{
"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 :(得分:3)
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"
]
}
答案 1 :(得分: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
。
如果你想要autoformat,a
并不适合,因为它对匹配的线条一无所知,你无法真正意识到这一点。
这有效,但并不像第一个那样微不足道:
sed -i '/paint_the_car/ s_\([ \t]*\).*_&\n\1"steps/Step_1/02_wax_the_car.json",_' file
\(something\)
将匹配某些内容,稍后可以使用\1
引用。
&
将引用替换命令第一部分中匹配的整个字符串。
答案 2 :(得分: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
答案 3 :(得分: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/.../.../
时,不需要引用第一个分隔符)。空匹配也使用最后一个默认值。最后,应引用匹配中的元字符,即.
,[
或]
等应为\.
,\[
或\]
等