한 파일의 정규식 일치 항목을 다른 파일의 줄로 바꾸기 [중복]

한 파일의 정규식 일치 항목을 다른 파일의 줄로 바꾸기 [중복]

=> '.*',한 파일의 정규식과 일치하는 줄을 다른 파일의 줄로 바꾸려고 합니다 .

두 개의 예제 파일.

파일 1:

    'text_clear' => 'Clear',
    'text_search' => 'Search',
    'text_enabled' => 'Enabled',

파일 2:

emptied
lost
turned off

awk/sed/grep을 사용하여 Linux 명령을 실행하여 세 번째 파일을 생성하려고 합니다.

파일 3:

    'text_clear' => 'emptied',
    'text_search' => 'lost',
    'text_enabled' => 'turned off',

Python 스크립트를 편집하려는 내용을 성공적으로 추출했지만 가능하다면 두 작업을 모두 수행하기 위해 Linux 명령만 사용하고 싶습니다.

나는 이 문제로 3시간 동안 머리를 쥐어뜯었습니다. 어떤 도움이라도 대단히 감사하겠습니다.

답변1

code.awk:

BEGIN{j=1}
NR==FNR{a[NR]=$0;next}
sub(/=> '.*',$/,"=> '"a[j]"',"){++j}
1
awk -f code.awk file2 file1 > file3

한 줄씩설명하다:

  • 초기화 j=1.
  • 의 각 행을 file2배열에 넣습니다 a.
  • 에서 각 줄에 대해 정규식과 일치하는 문자열을 file1연결하여 바꾸십시오 . 대체가 발생하면 증가합니다 .=> '.*',$=> ' a[j] ',j
  • 이 줄을 인쇄하세요.
$ cat file3
    'text_clear' => 'emptied',
    'text_search' => 'lost',
    'text_enabled' => 'turned off',

답변2

match및를 사용하는 또 다른 awk 방법 substr:

$ awk -v pat="'[^']*'" -v q="'" -v file2='File2' '
  BEGIN{OFS=FS=" => "}
  match($2,pat) && ((getline str < file2) > 0) {
    $2 = substr($2,1,RSTART-1) q str q substr($2,RSTART+RLENGTH)
  }
  1
' File1
    'text_clear' => 'emptied',
    'text_search' => 'lost',
    'text_enabled' => 'turned off',

답변3

또 다른 awk해결책:

$ awk -F"'" -v OFS="'" '(getline line < "file2")==1{$4=line} 1' file1
    'text_clear' => 'emptied',
    'text_search' => 'lost',
    'text_enabled' => 'turned off',

이는 각 입력 줄에 교체할 ​​필드 앞에 2개의 작은따옴표 문자가 있다는 사실에 의존합니다.

정규식과 일치하는 줄만 바꾸려면 => '.*',다음을 사용할 수 있습니다.

awk -F"'" -v OFS="'" '/=> \x27.*\x27,/ && (getline line < "file2")==1{$4=line} 1' file1

답변4

paste다음은 and 를 사용한 깔끔한 솔루션입니다 sed.

$ cat file1
    'text_clear' => 'Clear',
    'text_search' => 'Search',
    'text_enabled' => 'Enabled',
$ cat file2
emptied
lost
turned off
$ paste file1 file2 | sed 's/=> \'.*\',\t\(.*\)/=> \'\1\',/'
    'text_clear' => 'emptied',
    'text_search' => 'lost',
    'text_enabled' => 'turned off',

관련 정보