同じフレーズで始まる複数行を1つにまとめる

同じフレーズで始まる複数行を1つにまとめる

Arch Linuxパッケージを私が作成しているパッケージマネージャの形式に変換するために、Bashスクリプトを作成していますが、一部のメタデータファイルをファイル形式に変換する必要があります.toml。以前も使用してきましたが、sedBashスクリプトで実装できることが必要でした。変換は次のようにする必要があります。

入力する:

... other stuff ...
depends = "some-dependency"
depends = "another-dependency"
depends = "yet-another-dependency"

出力:

... other stuff already converted ...
depends = [ "some-dependency", "another-dependency", "yet-another-dependency" ]

答え1

使用awk:

awk -F' = ' '
    $1 == "depends" {
        printf "%s %s", (flag!=1 ? "depends = [" : ","), $2
        flag=1
        next
    }
    flag {
        print " ]"
        flag=0
    }
    { print }
    END {
        if (flag) print " ]"
    }
' file

入力する:

... other stuff ...
depends = "some-dependency"
depends = "another-dependency"
depends = "yet-another-dependency"
... more stuff ...
depends = "next-dependency"
depends = "and-another-dependency"

出力:

... other stuff ...
depends = [ "some-dependency", "another-dependency", "yet-another-dependency" ]
... more stuff ...
depends = [ "next-dependency", "and-another-dependency" ]

答え2

入力ファイルの「...other stuff..」部分を除外するには、次のコードを使用できます。

$ awk -F"=" 'NR==1{printf $1 " = [" } {printf $2 ","};END{print""}' infile | sed 's/.$/\]/'

depends  = [ "some-dependency", "another-dependency", "yet-another-dependency"]

関連情報