구성 파일이 있습니다.
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 관련 측면을 고려하면 sed
GNU를 사용하고 있는 것으로 보입니다).0,/.../
if sed -n '/device: 1000/q; /^\[old\]/Q1' < file; then
echo OK
fi
( , 종료 상태 0(성공)으로 종료하는 표준 형식인 q
반면 종료 상태 1(0이 아니므로 실패)로 종료하는 표준 형식입니다.Q0
Q1
표준을 사용하면 종료 상태를 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