如何使用awk / sed在两行之间添加新的文本行? (在文件中)

时间:2016-01-21 12:41:47

标签: json linux bash 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行之间的列表中添加一个新行(步骤)。比方说,如果我需要为步骤“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次。 我需要你的帮助男/女。

4 个答案:

答案 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/.../.../时,不需要引用第一个分隔符)。空匹配也使用最后一个默认值。最后,应引用匹配中的元字符,即.[]等应为\.\[\]