web-dev-qa-db-ja.com

最後の行を除くすべての行の末尾にコンマを追加するにはどうすればよいですか?

この種類のファイルのすべての行の最後に、最後の行を除いてコンマを追加します。

私は今これを持っています:

{...}
{...}
{...}
{...}

これ欲しい:

{...},
{...},
{...},
{...}

コマンドラインでどうすればいいですか? sedコマンドで可能ですか?

21
Joan Triay

次のsedスクリプトには、最後ではない行に一致するアドレス式$!と、行末の隣にコンマを追加する置換アクションs/$/,/があります。

sed '$!s/$/,/' file

(アドレスの$は最後のを参照し、置換の正規表現の$は最後の文字位置を参照します何らかの意味で似ていますが、それらは無関係です。)

これにより、fileの変更内容が標準出力に出力されます。別のファイルにリダイレクトしてファイルに保存するか、sedがサポートしている場合はsed -iを使用します。 (一部のバリアントでは、-iオプションへの空の引数、特に* BSD/OSX sedが必要です。)

あなたの仕事がそうでないものから有効なJSONを生成することであるなら、私はこのアプローチに懐疑的です。構造化フォーマットは、基本的な行指向ツールではなく、構造化フォーマットを理解するツールで操作する必要があります。ただし、これが行指向のデータを適切なJSONに変換するのに役立つ場合は、おそらく有効な使用方法です。

...後から考えてみると、出力も角括弧で囲む必要があるかもしれません。その後、実際には技術的に有効なJSONです(各行がそれ自体で有効なJSONフラグメントであると仮定します)。

sed '1s/^/[/;$!s/$/,/;$s/$/]/' file

最初の行(アドレス式1)で、行の先頭の開き角括弧(s/^/[/)に置き換えます。最後ではない行に、上記のように末尾のコンマを追加します。 is最後の行(アドレス式$)で、行の終わりに閉じ角括弧(s/$/]/)を追加します。セミコロンよりも改行を好むなら、それで問題ありません。多くのsed方言では、これを複数の-e引数に分割することもできます。

52
tripleee

シンプルに、awkを使用してください:

$ awk '{printf "%s%s",sep,$0; sep=",\n"} END{print ""}' file
{...},
{...},
{...},
{...}
3
Ed Morton