=> '.*',
한 파일의 정규식과 일치하는 줄을 다른 파일의 줄로 바꾸려고 합니다 .
두 개의 예제 파일.
파일 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',