문자열의 일부를 변수 [중복]으로 바꾸는 동안 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 키 아래의 배열 에 현재 줄( 로 표시됨)을 추가합니다 file2. a[FNR]=$0$0a

    이 명령은 nextawk에게 나머지 명령을 건너뛰고 다시 시작하도록 지시합니다 next.

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

    그러면 file1의 모든 행이 배열에 저장됩니다 b.

    여기서는 유사한 테스트를 사용하여 NR<=length(a)+FNR두 번째 파일을 읽고 있는지 확인합니다. 키 FNR 아래의 배열 b[FNR]=$0에 현재 행( 로 표시됨)을 추가합니다 .$0b

    이 명령은 nextawk에게 나머지 명령을 건너뛰고 다시 시작하도록 지시합니다 next.

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

    여기에 도착하면 세 번째 파일을 읽고 있는 것입니다. 이는 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

나는 그것이 매우 간단하다고 생각한다. 질문이 있으시면 알려주시기 바랍니다.

관련 정보