$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
정규 표현식 없이 올바른 콘텐츠를 일치시키도록 더 주의해야 합니다. 그렇다면 우리 $cont
는 12
그렇습니다아니요로 시작하는 줄을 일치시키고 싶습니다 123
. 그렇기 때문에 with 다음에 $cont
숫자가 아닌 숫자 ( 숫자라고 [^0-9]
가정 )를 명시적으로 일치시킵니다.$cont
이 awk
명령처럼 읽고 infile
씁니다 outfile
.
$cont
또는 슬래시가 포함된 경우 $newLineCont
이스케이프 처리해야 하며 \/
, $cont
정규식에 다른 특수 문자가 포함된 경우에도 올바르게 이스케이프 처리해야 합니다.