Linuxでは、キー名と一致する行を変更するのに役立ちます。

Linuxでは、キー名と一致する行を変更するのに役立ちます。

入力ファイル(2行、2つのKey-Valueペア):

key1 = "x"
key2 = ['a', 'b', 'c']

この入力ファイルを使用して、他のファイルのキーと値のペアを置き換える必要があります。

File1(2行、2つのキーと値のペアを含む):

key1 = "y"
key2 = ['p' , 'q', 'r']

これを行うためのシェルスクリプトの簡単な方法があるかどうかを教えてください。

ベストアンサー1

何を保管したいのか完全にはわかりません。file.txt次のように、テキストとキーと値のペアを含むファイルにパッチを適用するとします。

key1
key2
text
key1 = "original"
key2 = ['o' , 'r', 'i', 'g']
text

次のようにpatchfile.txt置き換える値のみを含むキーと値のペア

key1 = "patched"
key2 = ['p', 'a', 't', 'c', 'h']

このような結果を得るためにテキストを上書きしないか、key1キーkey2と値のペアを使用しないfile.txt

key1
key2
text
key1 = "patched"
key2 = ['p', 'a', 't', 'c', 'h']
text

このようなコマンドを出すと

patchmystuff.sh file.txt patchfile.txt

の内容はpatchmystuff.sh次のとおりです。

#!/usr/bin/env bash

original_file=$1
patch_file=$2

# loop from here:
# https://stackoverflow.com/questions/1521462/looping-through-the-content-of-a-file-in-bash
while IFS="" read -r line || [ -n "$line" ]
do
    printf 'patching %s\n' "$line"
    # (?<==) is the lookbehind for = to keep it
    # otherwise it will match key1/key2 in regular text
    search_string=$(echo "$line" | perl -ne 's/(?<==).*//g; print;')
    printf 'search string: "%s"\n' "$search_string"
    sed -i -e "s/$search_string.*/$line/g" "$original_file"
done < "$patch_file"

おすすめ記事