如何解析一行并替换第N列的内容?

时间:2018-12-18 03:03:58

标签: awk sed

我有一个像这样的文件:

def rollback(version) when is_integer(version) do
  re = ~r/^#{version}_.*\.exs/
  path = Application.app_dir(:your_app, Path.join(["priv", "repo", "migrations"]))

  with {:find, "" <> file} <- {:find, Enum.find(File.ls!(path), &String.match?(&1, re))},
        {:compile, [{mod, _} | _]} <- {:compile, Code.compile_file(Path.join(path, file))},
        {:rollback, :ok} <- {:rollback, Ecto.Migrator.down(Repo, version, mod)} do
    {:ok, "Reversed migration: #{file}"}
  else
    {:find, _} -> {:error, "No migration found with version prefix: #{version}"}
    {:compile, e} -> {:error, "Problem compiling migration module: #{inspect(e)}"}
    {:rollback, e} -> {:error, "Problem reversing migration: #{inspect(e)}"}
    e -> {:error, "Something unexpected happened: #{inspect(e)}"}
  end
end

基本上是一个1|somename|gender|location 2|red|light|10|34|90||100 2|green|dark||44|9|1| 分隔文件,第一行有4列,行2和3有8列。

我想编写一个sed或awk命令来替换|列或Nth行。例如,替换第1行的第1列或替换第1行的第3列或替换第2行的第4列,等等。

1 个答案:

答案 0 :(得分:0)

请您尝试以下。

awk 'BEGIN{FS=OFS"|"} FNR==1{$3="NEW_VAL"} 1' Input_file

或者通过以下方式使行号和列号作为变量传递(您可以在其中简单地更改变量值,它应该适用于新值)

awk -v line=1 -v column=3 'BEGIN{FS=OFS="|"} FNR==line{$column="NEW_VAL"} 1' Input_file

如果您想将输出保存到Input_file本身,也将> temp_file && mv temp_file Input_file附加到上述代码中。