텍스트 블록의 특정 텍스트를 다른 파일의 값으로 바꾸는 방법은 무엇입니까?

텍스트 블록의 특정 텍스트를 다른 파일의 값으로 바꾸는 방법은 무엇입니까?

텍스트 줄 블록을 반복했습니다.

I love banana  
I love mango  
I love papaya  
I love guava  
I love peaches  
I love baby  
I love watermelon  
I love banana  
I love mango  
I love papaya  
I love guava  
I love peaches  
I love baby  
I love watermelon  
I love banana  
I love mango  
I love papaya  
I love guava  
I love peaches  
I love baby  
I love watermelon  
I love banana
I love mango  
I love papaya  
I love guava  
I love peaches  
I love baby  
I love watermelon  
I love banana  
I love mango  
I love papaya  
I love guava  
I love peaches  
I love baby  
I love watermelon  

다음 텍스트가 포함된 다른 파일이 있습니다.

D1  
D2  
D3  
D4  
D5  

용어가 발견될 때마다 baby두 번째 파일의 연속 용어로 대체되어야 합니다. 예를 들어 first 의 경우 다음 baby으로 대체됩니다.

I love D1  

두 번째 항목의 경우 파일 끝까지 baby대체됩니다 . D2아래에는 실패한 시도에 대한 요약이 나와 있습니다(매우 캐주얼하게 언급되었습니다...죄송합니다). 누구든지 나를 도와줄 수 있나요?

for x in `cat test1.txt|tr -d '\r'`; do awk '{gsub(/baby/,'"$x"')}' test3.txt ; done

for x in `cat test1.txt|tr -d '\r'`; do sed -i 's/baby/$x/g' test3.txt ; done

sed "0,/baby/{s/baby/$x/}" "test3.txt"  

for x in `cat test1.txt|tr -d '\r'`; do awk 'NR==1,/baby/{sub(/baby/,'"$x"')} print' test3.txt ; done  
awk '/^baby$/&&getline<"test1.txt"||1' test3.txt

awk 'NR==FNR{Arr[NR]=$0;next}{if($0==baby){i++;print Arr[i]}else{print}}' test3.txt test1.txt

#!/bin/bash

while read -r line; do  
    if [[ "$line"  == baby ]]; then  
        sed -n '1p' test3.txt  
        sed -i".bup" '1d' test3.txt   
    else  
        echo "$line"  
    fi    
done < test1.txt

답변1

file2.txt발생 횟수보다 입력 줄이 더 많다고 확신하는 경우 baby간단한 스크립트를 사용할 수 있습니다.

awk 'BEGIN{ sf="file2.txt"}
     /baby/ {  getline var <sf; gsub(/baby/,var,$0) }
print
' file1.txt

그러나 더 강력한 스크립트는 판독값에 file2.txt오류가 있는지 확인하거나 스크립트가 file2.txt의 끝에 도달하면 처음으로 돌아갈 수 있습니다.

awk 'BEGIN{ sf="file2.txt"}
/baby/{
         # If at the end of second file, rewind to start.
         while( (test=(getline var <sf)) != 1 ){
            if( test==-1 ){ print "Error: file ",sf,":",ERRNO; exit 1 }
            if( test==0  ){ close(sf); continue }
                # This script should never get up to here
                print "Unexpected error"; exit 2
            }
         sub(/baby/,var ,$0)
     }
1
' file1.txt

file2.txt에 D1, D2, D3, D4 네 줄만 포함되어 있으면 다음과 같은 결과가 나타납니다.

$ ./script
I love banana
I love mango
I love papaya
I love guava
I love peaches
I love D1
I love watermelon
I love banana
I love mango
I love papaya
I love guava
I love peaches
I love D2
I love watermelon
I love banana
I love mango
I love papaya
I love guava
I love peaches
I love D3
I love watermelon
I love banana
I love mango
I love papaya
I love guava
I love peaches
I love D4
I love watermelon
I love banana
I love mango
I love papaya
I love guava
I love peaches
I love D1
I love watermelon

답변2

또 다른 이상한

awk -v f='file2' '$3=="baby"{getline $3 <f}1' file1

file1의 field3=baby가 $3을 file2의 한 줄로 바꿀 때마다.

편집하다:

내가 잘 이해한다면 file1의 행은 다음과 같습니다.

Ilovepeaches
Ilovemybeautifulbabygirl
Ilovewatermelon

각 아기를 file2의 한 줄로 바꾸고 싶습니다.

따라서 다음과 같이 시도해 볼 수 있습니다.

awk -v search='baby' -v f='file2' '
  $0 ~ search {
     split($0,lign,search)
     getline <f
     $0=lign[1]$0lign[2]
}1' file1

산출:

Ilovepeaches
IlovemybeautifulD3girl
Ilovewatermelon

답변3

file2대체 텍스트 및 file1반복 텍스트를 포함하여 awk 사용 :

awk 'FNR == NR {baby[NR] = $0; next} /baby/ {count++; $NF = baby[count]} 1'  file2 file1

이는 file2첫 번째 파일 매개변수이지 file1.

설명하다:

  • FNR == NR이는 awk가 읽는 첫 번째 파일에 적합하므로 file2여기에 있습니다. 이 파일의 경우 각 줄을 줄 번호로 색인된 배열에 저장합니다.
  • 두 번째 파일의 경우 count일치하는 각 줄을 유지 baby하고 배열에서 해당 개수에 대한 항목을 가져온 다음 마지막 필드를 해당 항목으로 바꿉니다.

내가 얻는 결과는 다음과 같습니다.

~ awk 'FNR == NR {baby[NR] = $0; next} /baby/ {count++; $NF = baby[count]} 1'  file2 file1
I love banana
I love mango
I love papaya
I love guava
I love peaches
I love D1
I love watermelon
I love banana
I love mango
I love papaya
I love guava
I love peaches
I love D2
I love watermelon
I love banana
I love mango
I love papaya
I love guava
I love peaches
I love D3
I love watermelon
I love banana
I love mango
I love papaya
I love guava
I love peaches
I love D4
I love watermelon
I love banana
I love mango
I love papaya
I love guava
I love peaches
I love D5
I love watermelon

관련 정보