대규모 파일 세트를 일부 변경해야 하는데 변경 여부에 대한 조건은 이전 줄의 내용에 따라 결정됩니다.
예:
<element1>
<value>true</value>
이 경우에는 줄을 true로 변경하고 싶습니다.
그러나 다음과 같은 상황이 발생하는 경우:
<wrong_element>
<value>true</value>
글쎄, 나는 그것을 바꾸고 싶지 않습니다.
sed를 사용하여 변경할 수 있지만 모든 값이 변경됩니다. 파일마다 공간의 양이 다를 수 있으므로 공백을 무시하도록 설정할 수도 있습니다.
sed를 읽고 해당 줄을 기준으로 평가합니다. 이전 줄의 내용을 기반으로 어떻게 변경할 수 있나요?
답변1
이것은 "sed"가 아니라 "awk"인 것 같습니다.
cat file | awk 'BEGIN {lastLINE="XXX";} \
{ if ( lastLINE ~ /element1/ ) gsub(/BADtextREGexpression/,"replaceTEXT") ; printf("%s\n",$0); lastLINE = $0; }'
오류가 없으면 위 코드는 마지막 줄에 정규식 "element1"과 일치하는 조각이 없으면 변경되지 않은 모든 줄을 인쇄합니다. 이 경우 인쇄하기 전에 "replaceTEXT"를 현재 행(BADtextREG 표현식 대신)으로 전체적으로 대체합니다.
$0은 입력 파일에서 방금 읽은 현재 전체 행을 나타내는 변수이며 gsub()의 기본 대상입니다.
"sed"가 꼭 필요한 경우 어떻게 해야 할지 모르겠습니다.
온라인 "awk" 매뉴얼 링크:https://www.gnu.org/software/gawk/manual/gawk.html