AWK는 다음으로 시작하는 줄을 바꿉니다.

AWK는 다음으로 시작하는 줄을 바꿉니다.

$cont변수의 내용으로 시작하는 파일의 줄을 바꾸고 싶습니다 awk.

5473  12G Ju 2 06:32 part3
5423  11G Ju 6 07:32 part4
573  11G Ju 2 08:21 part5
5473  11G Ju 6 09:12 part6
5423  1G Jl 6 09:32 part7

나는 sed지금 그것을 사용하고 있지만 같은 일을 하는 데 너무 많은 시간을 소비하고 있습니다.

sed코드는 아래와 같이 표시됩니다.

이제 로 시작하는 줄을 찾아서 삭제하고 파일 $cont에 쓰겠습니다 .$cont

cont="foo"
 newLineCont ="this is new line"
    parallel -a test.txt -k --block 30M --pipe-part "sed -i /^$cont/d" test.txt
      echo $newLineCont >> test.txt

AWK를 사용하여 파일에서 $cont 변수의 내용으로 시작하는 줄을 검색하고 이를 $newLineCont의 내용으로 바꾸고 싶습니다.

답변1

$newLineCont공백으로 구분된 첫 번째 필드가 같으면 각 전체 줄을 다음으로 바꿉니다 $cont.

awk -v c="$cont" -v nc="$newLineCont" '$1 == c { $0 = nc } 1' <infile >outfile

그러면 . infile라는 이름의 새 파일을 읽고 생성합니다 outfile. 행의 첫 번째 필드가 와 같으면 $cont전체 행이 대체됩니다 $newLinecont.

후행은 모든 줄을 인쇄하는 1간단한 작성 방법입니다 .{ print }


가져가다Stéphane Chazelas는 아래에 댓글을 달았습니다.다음 사항을 고려하십시오(하나 또는 두 변수 모두 백슬래시를 포함하는 경우).

env c="$cont" nc="$newLineCont" awk '$1 == ENVIRON["c"] { $0 = ENVIRON["nc"] } 1' <infile >outfile

사용 sed:

sed "s/^$cont[^0-9].*/$newLineCont/" <infile >outfile

를 사용하는 경우 sed정규 표현식 없이 올바른 콘텐츠를 일치시키도록 더 주의해야 합니다. 그렇다면 우리 $cont12그렇습니다아니요로 시작하는 줄을 일치시키고 싶습니다 123. 그렇기 때문에 with 다음에 $cont숫자가 아닌 숫자 ( 숫자라고 [^0-9]가정 )를 명시적으로 일치시킵니다.$cont

awk명령처럼 읽고 infile씁니다 outfile.

$cont또는 슬래시가 포함된 경우 $newLineCont이스케이프 처리해야 하며 \/, $cont정규식에 다른 특수 문자가 포함된 경우에도 올바르게 이스케이프 처리해야 합니다.

관련 정보