파일의 별도 줄에 있는 다른 문자열 앞에 문자열이 있는지 테스트하는 방법

파일의 별도 줄에 있는 다른 문자열 앞에 문자열이 있는지 테스트하는 방법

구성 파일이 있습니다.

a: 123
b: abc
device: 1000
c: xyz

[old]
a: 120
b: xyz
device: 200
c: abc

"[old]" 섹션과 그 아래의 모든 항목이 항상 존재하는 것은 아닙니다.

파일의 선택적 "[old]" 섹션 앞에 "device: 1000" 텍스트가 있는지 확인하는 방법은 무엇입니까?

다음 (깨진) 명령 구문을 만지작거렸지만 필요한 작업을 수행할 수 없습니다...

sed -e '0,/^\[/;  /device: /p' configfile ; echo $?

... 0,/^\[/파일 시작 부분과 첫 번째 열에서 "["가 처음 나타나는 부분 사이의 검색을 제한해야 합니다. 문자열이 발견되었는지 나타내는 반환 코드를 얻으려고 합니다.

답변1

awk옵션인 경우 :

awk 'BEGIN{o=d=1} /\[old\]/{o=0} /device: 1000/&&o==1{d=0;exit} END{exit d}' file

설명하다:

  • BEGIN{o=d=1}:변수 초기화
  • /\[old\]/{o=0}if [old]: 설정된 것으로 확인됨o=0
  • /device: 1000/&&o==1{d=0;exit}: device: 1000찾았으나 [old]아직 찾지 못한 경우 파일을 더 이상 확인하지 않고 d=0해당 블록을 설정하고 점프합니다 .END{}
  • END{exit d}: 주어진 값으로 종료d

다음과 같이 실행하세요:

awk 'BEGIN{o=d=1} /\[old\]/{o=0} /device: 1000/&&o==1{d=0;exit} END{exit d}' file && echo "contains" || echo "contains not"

답변2

나는 보통 sed를 사용하여 여러 줄을 변수에 캡처하여 blob을 만듭니다. 필수 조건이 충족되면 나중에 확인할 수 있습니다.

blob=“$(sed -n “/^abc.*$/,/^$/p” file)”

이제 파일의 상단 부분을 ”${blob}”.

이제 조건부로 존재하는지 확인 ${blob}합니다 [old].

sh if [ $(grep -c “^\[old/]$” file) -gt 0 ]; then echo “${blob}” | grep “^device” | grep -c 1000 fi

이것이 리팩터링될 수 있다고 확신하지만 이렇게 하면 원하는 결과를 얻을 수 있습니다.

답변3

device: 1000다음 내용을 모두 삭제한 후 이를 찾을 수 있습니다 [old].

if sed '/^\[old\]/q' < file | grep -q 'device: 1000'; then
  echo OK
fi

GNU를 사용하십시오(귀하의 방법의 GNU 관련 측면을 고려하면 sedGNU를 사용하고 있는 것으로 보입니다).0,/.../

if sed -n '/device: 1000/q; /^\[old\]/Q1' < file; then
  echo OK
fi

( , 종료 상태 0(성공)으로 종료하는 표준 형식인 q반면 종료 상태 1(0이 아니므로 실패)로 종료하는 표준 형식입니다.Q0Q1

표준을 사용하면 종료 상태를 sed변경할 수 없지만 무언가를 출력하는지 여부에 의존할 수 있습니다.sed

if [ -n "$(sed -n '/^\[old\]/q;/device: 1000/!d;=;q' < file)" ]; then
  echo OK
fi

( =줄 번호의 첫 번째 항목이 출력됩니다 device: 1000.)

또는 awk이를 사용하여 종료 상태를 이식 가능하게 설정할 수 있습니다.

if awk '$0 == "[old]" {exit 1}; /device: 1000/ {exit 0}' < file; then
  echo OK
fi

관련 정보