3개의 텍스트 파일이 있습니다. in에서 문자열을 검색하여 find의 문자열 file3
로 바꾸고 싶습니다 . 에서 문자열 끝에 사용자 정의 태그를 추가하고 그 안에 있는 문자열 부분을 바꿔야 합니다 .file2
file1
file1
file3
file2
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
$0
a
이 명령은
next
awk에게 나머지 명령을 건너뛰고 다시 시작하도록 지시합니다next
.NR<=length(a)+FNR{b[FNR]=$0; next}
그러면 file1의 모든 행이 배열에 저장됩니다
b
.여기서는 유사한 테스트를 사용하여
NR<=length(a)+FNR
두 번째 파일을 읽고 있는지 확인합니다. 키 FNR 아래의 배열b[FNR]=$0
에 현재 행( 로 표시됨)을 추가합니다 .$0
b
이 명령은
next
awk에게 나머지 명령을 건너뛰고 다시 시작하도록 지시합니다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
나는 그것이 매우 간단하다고 생각한다. 질문이 있으시면 알려주시기 바랍니다.