sedを使用してforループの複数行と単語を置き換える

sedを使用してforループの複数行と単語を置き換える

Linuxシステムにデータを含む2つのファイル(macおよび)があり、データを変数に置き換えるためのリストを含むuid「テンプレート」に転送しようとしています。sed

リスト.txt:

CP00
CP01

mac.txt:

FF-AA-BB-AA-DD-AA
00-AA-11-AA-11-EE

uid.txt:

e3442342a
e43342f0a

型:

#Template for Cobbler:
"uid": "change1",
"mac_address": "change2",

テンプレートを含む2つのファイルが必要です。最初のファイルには最初の「uid」と最初の「mac」が含まれ、2番目のファイルには2番目の「uid」と2番目の「mac」が含まれます。

私はこれを試していますが、動作しません。

change1=$(cat /tmp/cobbler/uid.txt); 
change2=$(cat /tmp/cobbler/mac.txt); 
for i in `cat /tmp/cobbler/list.txt`; do 
    echo $i | cat /tmp/cobbler/template | 
      sed -e "s/change1/$change1/g" -e "s/change2/$change2/g" >> /tmp/cobbler/$i; 
done

結果はリストの2つの名前を組み合わせて、CP00CP01最初の「uid」と最初の「mac」だけを入れます。

誰でも私を助けることができますか?ありがとうございます!

ベストアンサー1

awkを使用してください。

$ cat tst.sh
#!/usr/bin/env bash

cd /tmp/cobbler &&
awk '
FILENAME == ARGV[1] { uids[FNR] = $1 }
FILENAME == ARGV[2] { macs[FNR] = $1 }
FILENAME == ARGV[3] { outs[FNR] = $1 }
FILENAME == ARGV[4] {
    for ( outNr in outs ) {
        if ( $1 == "\"uid\":" ) {
            $2 = "\"" uids[++uidNr] "\","
        }
        if ( $1 == "\"mac_address\":" ) {
            $2 = "\"" macs[++macNr] "\","
        }
        print > (outs[outNr] ".txt")
    }
}
' uid.txt mac.txt list.txt template

$ ./tst.sh

$ head /tmp/cobbler/CP*
==> /tmp/cobbler/CP00.txt <==
#Template for Cobbler:
"uid": "e3442342a",
"mac_address": "FF-AA-BB-AA-DD-AA",

==> /tmp/cobbler/CP01.txt <==
#Template for Cobbler:
"uid": "e43342f0a",
"mac_address": "00-AA-11-AA-11-EE",

おすすめ記事