文字列の一部を変数[重複]に置き換えている間にSedエラーが発生しました。

文字列の一部を変数[重複]に置き換えている間にSedエラーが発生しました。

3つのテキストファイルがあります。 inで文字列を検索してfindの文字列file3に置き換えたいと思います。で文字列の末尾にカスタムタグを追加し、その中の文字列部分を置き換える必要があります。file2file1file1file3file2

file3

aws ec2 create-tags --region us-east-1 --resourcesi-XXXXX --tags Key=Developer Name,Value=XXXXX Key=Resource Group,Value=arn:aws:iam::XXXXX:root
aws ec2 create-tags --region us-east-1 --resourcesi-XXXX --tags Key=Developer Name,Value=XXXXX Key=Resource Group,Value=arn:aws:iam::XXXXX:user/user

file2

arn:aws:iam::XXXXX:root 
arn:aws:iam::XXXXX:user/user

file1

my_custom_tag_1
my_custom_tag_2

希望の出力:

aws ec2 create-tags --region us-east-1 --resourcesi-XXXXX --tags Key=Developer Name,Value=XXXXX Key=Resource Group,Value=my_custom_tag_1
aws ec2 create-tags --region us-east-1 --resourcesi-XXXX --tags Key=Developer Name,Value=XXXXX Key=Resource Group,Value=my_custom_tag_2

ファイルの行を配列にロードし、置換項目にインデックスを含めましたsed

sed "s|${file2array[0]}|${file1array[0]}|g" file3.txt

ただし、これは「古い正規表現なし」エラーを返します。また、forループを使用して配列インデックスを一意の変数に書き込み、上記と同じ方法を変数に使用してみました。

sed "s|$var2|$var1|g" file3.txt

これも失敗

楽しく、

sed "s|${file2array[0]}|customtext}|g" file3.txt

失敗したけど

sed "s|customtext|${file1array[0]}|g" file3.txt

効果がありました。

どんな助けでも大変感謝します。これまで何十時間もこれをやってきました。

答え1

努力する:

awk 'FNR==NR{a[FNR]=$0; next} NR<=length(a)+FNR{b[FNR]=$0; next} {for (i=1;i<=length(a);i++) gsub(a[i], b[i])} 1' file2 file1 file3

たとえば、

$ awk 'FNR==NR{a[FNR]=$0; next} NR<=length(a)+FNR{b[FNR]=$0; next} {for (i=1;i<=length(a);i++) gsub(a[i], b[i])} 1' file2 file1 file3
aws ec2 create-tags --region us-east-1 --resourcesi-XXXXX --tags Key=Developer Name,Value=XXXXX Key=Resource Group,Value=my_custom_tag_1
aws ec2 create-tags --region us-east-1 --resourcesi-XXXX --tags Key=Developer Name,Value=XXXXX Key=Resource Group,Value=my_custom_tag_2

どのように動作しますか?

  • FNR==NR{a[FNR]=$0; next}

    これにより、file2のすべての行が配列に保存されますa

    FNR は、現在のファイルから読み取った行数です。 NR は読み取った行の総数です。したがってFNR==NR、我々はFNRキーの下の配列に現在の行(で示されている)を追加しますfile2a[FNR]=$0$0a

    このコマンドは、nextawkに残りのコマンドをスキップして再起動するように指示しますnext

  • NR<=length(a)+FNR{b[FNR]=$0; next}

    これにより、file1のすべての行が配列に保存されますb

    ここでは、同様のテストを使用してNR<=length(a)+FNR2番目のファイルを読み込んでいることを確認します。キーFNRの下の配列b[FNR]=$0に現在の行(で示されている)を追加します。$0b

    このコマンドは、nextawkに残りのコマンドをスキップして再起動するように指示しますnext

  • for (i=1;i<=length(a);i++) gsub(a[i], b[i])

    ここに到着すると、3番目のファイルを読んでいます。これは、file2の行に一致するすべてのテキストをfile1の対応するテキストに置き換えます。

    配列for (i=1;i<=length(a);i++)内の各行の行番号を繰り返しますa

    gsub(a[i], b[i])a[i]すべてのテキスト項目を text に置き換えますb[i]

    file2 のテキストは正規表現として扱われます。このファイルに正規表現のアクティブ文字を含める必要がある場合は、エスケープする必要があります。

  • 1

    これはprint-the-lineのawkの神秘的な速記です。

答え2

私は書くことができます

awk '
  BEGIN { FS = OFS = "=" }
  FILENAME == "file1" {
    tag[FNR] = $0
  }
  FILENAME == "file2" {
    str[$0] = FNR
  }
  FILENAME == "file3" {
    if ($NF in str) $NF = tag[str[$NF]]
    print
  }
' file1 file2 file3

とてもシンプルだと思います。ご質問がございましたらお知らせください。

関連情報