Awk 또는 Sed: 패턴이 발견된 경우: 줄 삭제 및 변수 내보내기

Awk 또는 Sed: 패턴이 발견된 경우: 줄 삭제 및 변수 내보내기

debug: Debug내 bashscript에서 Sed가 파일을 살펴보고 ${SourceP}발견되면 해당 줄을 제거하고 환경으로 내보내기를 원합니다.Debug=Debug

sed -i '/debug: Debug/,+0 d' ${SourceP} && export Debug=Debug

하지만 아쉽게도 Debug=Debug패턴을 찾지 못하더라도 내보내기가 됩니다.

이를 달성하는 방법: Debug=Debug패턴이 발견된 경우에만 행을 내보내고 삭제합니다.

sed를 사용할 수 없나요?


나는 이것을 시도했지만 awk그 중 하나도 작동하지 않습니다.

awk -i inplace '!/debug: Debug/' ${SourceP} && export Debug=Debug

편집: 정확하게 검색할 수 있었으면 좋겠습니다 debug: Debug.

답변1

awk어떻게든 부품에서 정보를 추출 해야 합니다 . 변수를 내보내거나 사용할 수 있습니다.종료 상태.

awk -i inplace 'BEGIN {err = 1}; {if (NR == 1 && /([[:space:]]|^)debug: Debug([[:space:]]|$)/) {err = 0} else {print}}; END {exit err}' ${SourceP} && export Debug=Debug

설명하다

  • BEGIN {err = 1}: 처음에는 오류 상태를 1로 설정합니다.
  • 그런 다음 첫 번째 행에 있고 NR == 1해당 행에 &&오류가 있는 경우 /([[:space:]]|^)debug: Debug([[:space:]]|$)/오류 상태를 0( err = 0)으로 설정합니다. 그렇지 않으면 다른 모든 줄을 인쇄합니다. 이 정규식은 debug: Debug공백이나 줄의 시작으로 시작하고 공백이나 줄의 끝으로 끝납니다.
  • 스크립트가 끝나면 awk오류 상태로 종료됩니다 {exit err}.
  • 따라서 /debug: Debug/해당 파일에서 발견되면 에러 상태가 0이 되어 &&실행됩니다.

답변2

test "$(sed -i -e '/debug: Debug/{w /dev/fd/1' -e 'd}' "$SourceP")" && export Debug=Debug

노트:

글은 ${SourceP}순수한 가식입니다. 그것은 단순함만큼이나 위험합니다 $SourceP. 당신이 원하는인용하다다음으로 변경하십시오: "$SourceP"또는 "${SourceP}".

/dev/fd/1대부분의 최신 Unix에서 지원되며 GNU 전용이며 이식성이 매우 낮습니다 sed -i.awk -i

관련 정보