일치하지 않는 경우 sed 값 반환
하고 sed
JSON을 사용하다파일에서 하지 않을 JSON이 될 수 있습니다sed
는 리턴 010으로 됩니다.
을 반환하는 하는데, 왜 0은 정상적으로 완료됩니까?sed
올바른 패턴을 찾지 못하면 0을 반환하고 파일을 업데이트합니다.것에에 대피? 피??? ???
@cnicutar가 코멘트했듯이 명령어 반환 코드는 명령어가 정상적으로 실행되었는지 여부를 나타냅니다.는, 코드/코드에 실장된 로직과는 관계가 없습니다.
다음 사항이 있는 경우:
echo "foo"|sed '/bar/ s/a/b/'
는 sed를 한다.0
그러나 구문/변환 오류를 쓰거나 입력/파일이 존재하지 않으면 sed는 요청을 실행할 수 없고 sed는 1을 반환합니다.
회피책
실제로는 회피책이 아닙니다.sed는 가지고 있다q
(남자) : (남자)
q [exit-code]
여기서, 필요에 따라서 종료 코드를 정의할 수 있습니다.를 들어, 「」입니다.'/foo/!{q100}; {s/f/b/}'
됩니다.foo
존재하지 않습니다.그렇지 않으면 대체 f->b를 실행하고 코드 0으로 종료합니다.
대소문자 일치:
kent$ echo "foo" | sed '/foo/!{q100}; {s/f/b/}'
boo
kent$ echo $?
0
대소문자가 일치하지 않음:
kent$ echo "trash" | sed '/foo/!{q100}; {s/f/b/}'
trash
kent$ echo $?
100
이게 당신의 질문에 답하길 바랍니다.
편집하다
덧붙이자면, 위의 예는 한 줄짜리 처리용입니다.받고 때exit 1
한 줄 또는 한한 、 일일치는전파 。하지 않는하거나 awk를 할 도 있습니다.grep
★★★★★★★★★★★★★★★...
이 방법이 효과적일 수 있습니다(GNU sed).
sed '/search-string/{s//replacement-string/;h};${x;/./{x;q0};x;q1}' file
경우,search-string
로 대체되는 것이 판명되었습니다.replacement-string
파일 의 " " " 입니다.sed
이쯤에서 .0
않으면 는 반환 코드가 반환됩니다.1
자세한 설명:
SED에서 사용자는 현재 회선이 로드되는 패턴 공간(PS)과 초기에 비어 있는 홀드 공간(HS)이라는 예비 레지스터의 두 가지 레지스터를 자유롭게 사용할 수 있습니다.
대체적인 생각은 HS를 플래그로 사용하여 대체가 이루어졌는지를 나타내는 것입니다.HS가 파일 끝에 아직 비어 있는 경우 변경은 이루어지지 않았으며, 그렇지 않은 경우 변경이 발생한 것입니다.
" " "/search-string/
search-string
되어 있는 것이 이든 PS가 되어 있는 ,search-string
다음 중괄호 사이의 명령어가 실행됩니다.
★★★★★★★★★★★★★★★★★★.s//replacement-string/
(sed "regexp" regexp" "regexp").search-string
있는 「」를 참조해 주세요.s//replacement-string
is is is is is와 s/search-string/replacement-string/
그 에 ( )이 있습니다.h
PS에 의한 HS에 관한 것입니다.
sed는 sed ★$
하기 위해 됩니다.그러면 일이 발생합니다
번째는 ★★★★x
명령어는 2개의 레지스터를 스왑하기 때문에 HS가 PS가 되고 PS가 HS가 됩니다.
으로 PS에서 됩니다././
).
의HS(일명 PS)입니다.이 " " " "x
뒤에 이 됩니다.q0
를 "sed"로 합니다.0
. 그 의 경우는, 「」를 참조해 주세요.x
가 "귀환 코드"로 됩니다.1
.
는 N.B. ,이지만q
sed 처리를 종료해도 PS가 sed에 의해 정상적으로 재조립되어 인쇄되는 것을 방해하지 않습니다.
또 다른 대안:
sed '/search-string/!ba;s//replacement-string/;h;:a;$!b;p;x;/./Q;Q1' file
또는 다음과 같이 입력합니다.
sed '/search-string/,${s//replacement-string/;b};$q1' file
이 답변들은 모두 너무 복잡하다.교환하고 싶은 것이 있는지 확인하기 위해 grep를 사용하는 셸 스크립트를 조금 쓰는 것은 어떤 문제가 있습니까?그 후 sed를 사용하여 교환합니다.
grep -q $TARGET_STRING $file
if [ $? -eq 0 ]
then
echo "$file contains the old site"
sed -e "s|${TARGET_STRING}|${NEW_STRING}|g" ....
fi
1행 입력의 경우./pattern/을 반복하지 않으려면:
s
to success to , " "를 합니다.t
조건부로 라벨로 점프한다.x
않으면 를 사용합니다q
코드 종료 코드)로합니다.100
:
's/pattern/replacement/;tx;q100;:x'
예:
$ echo 1 > one
$ < one sed 's/1/replaced-it/;tx;q1;:x'
replaced-it
$ echo $?
0
$ < one sed 's/999/replaced-it/;tx;q100;:x'
1
$ echo $?
100
https://www.gnu.org/software/sed/manual/html_node/Branching-and-flow-control.html
우리는 위의 답을 가지고 있지만, 나는 무슨 일이 일어나고 있는지 알아내는 데 시간이 좀 걸렸다.저와 같은 SED의 기본 사용자를 위해 간단한 설명을 하려고 합니다.
예를 들어 보겠습니다.
echo "foo" | sed '/foo/!{q100}; {s/f/b/}'
SED를 사용하다 번째는 첫첫 first first first first 。'/foo/!{q100}'
코드를 체크합니다.100
를 들면 다음과 같은 를 들 수 있습니다.-n
출력을 사일런트하기 위해 사용되므로 기존 코드만 얻을 수 있습니다.
은 foo가 .0
echo "foo" | sed -n '/foo/!{q100}'; echo $?
0
는 '먹다'라고 하는 입력 예시는 '먹다' 입니다.foo
해서 한 번 .boo
및 코드가 .100
echo "foo" | sed -n '/boo/!{q100}'; echo $?
100
따라서 패턴 일치 여부만 확인하는 것이 필요한 경우
echo "<input string>" | sed -n '/<pattern to match>/!{q<exit-code>}'
기타 예:
echo "20200206" | sed -n '/[0-9]*/!{q100}' && echo "Matched" || echo "No Match"
Matched
echo "20200206" | sed -n '/[0-9]{2}/!{q100}' && echo "Matched" || echo "No Match"
No Match
번째 는 " " " 입니다.'{s/f/b/}'
입니다.f
foo
b
★★★★★★★★★★★★★★★★★★★★★★★★★★
입니다.sed -rn
★★★★★★★★★★★★★★★★★」sed -r
.
전체 검색 및 바꾸기 명령("s/.../.../...")은 옵션입니다.검색 및 치환을 사용하는 경우 속도를 위해 $matchRe와 이미 일치한 $searchRe 값을 최대한 빠르게 사용합니다.이 경우 문자를 재검증할 필요가 없습니다.및 을 사용합니다.패턴의 고정 길이 섹션에 대한 {$len}입니다.
none의 반환값은 $notFoundExit입니다.
/$matchRe/{s/$searchRe/$replacement/$options; Q}; q$notFoundExit
다음과 같은 이유:
- 일치하는 케이스와 일치하지 않는 케이스 모두 테스트에 시간을 낭비하지 않음
- 버퍼 간 또는 버퍼 간 복사 시간 낭비 없음
- 불필요한 브랜치 없음
- 합리적인 유연성
Q 명령어의 대소문자를 변경하면 종료 타이밍에 따라 동작이 달라집니다.여러 줄 입력에 부울 로직을 적용하는 동작은 솔루션의 복잡성을 높여야 합니다.
임의의 수의 입력 라인에 대해서:
sed --quiet 's/hello/HELLO/;t1;b2;:1;h;:2;p;${g;s/..*//;tok;q1;:ok}'
일치 시 보류 공간을 채우고 마지막 줄 뒤에 체크합니다.를 반환합니다.1
일치하는 파일이 없는 경우.
s/hello/HELLO
- 확인 대체 - 확인 대체 - 확인 중t1
- 라벨로 점프1
에b2
- 라벨로 점프2
:1
- ★★★★1
h
- space (성공했을 때)- 유지 패턴(copy pattern to hold space):2
- ★★★★2
p
공간, - 인쇄 패턴 공간${ ... }
줄과 하고, 의 inside를 합니다.- 지- 、 부 - 、 부 - 、 -g
pattern space (첫 번째 한 경우 이 아님 - 패턴 공간에 저장공간 복사s/..*//
branch-substitute-substitution, -기 - - - - - - - - - - - - - - - -tok
- 라벨로 점프ok
홀드공간이 곳에서더미 치환이 ) ('더미 '은 '더미 치환'을 의미합니다)q1
상태 - 에러 상태 합니다.:ok
- ★★★★ok
이미 알고 있듯이 sed가 일치하지 않으면 입력 문자열만 반환되며 오류는 발생하지 않습니다.입력 스트링과 출력 스트링의 차이가 일치하는 것은 사실이지만, 모든 sed가 단순히 모든 입력 문자와 일치할 수 있었기 때문에 일치한다고 해서 문자열의 차이를 의미하는 것은 아닙니다.이 결함은 다음 예제에서 생성됩니다.
h=$(echo "$g" | sed 's/.*\(abc[[:digit:]]\).*/\1/g')
if [ ! "$h" = "$g" ]; then
echo "1"
else
echo "2"
fi
서 ''는g=Xabc1
1을 , 는 1을 설정합니다.g=abc1
2가 됩니다만, 이 두 입력 문자열은 모두 sed로 매칭됩니다.따라서 sed가 일치하는지 아닌지를 판단하기가 어려울 수 있습니다.★★★★★★★★★★★★★★★★★★:
h=$(echo "fix${g}ed" | sed 's/.*\(abc[[:digit:]]\).*/\1/g')
if [ ! "$h" = "fix${g}ed" ]; then
echo "1"
else
echo "2"
fi
이 경우 sed가 일치하는 경우에만 1이 출력됩니다.
일치하는 항목이 발견되면 종료하여 파일을 잘라내고(일치하는 줄은 제외) 싶었습니다.이것은 파일 끝에 행을 추가하는 프로세스를 다시 실행할 때 유용합니다."Q;Q1"은 작동하지 않았지만 다음과 같이 "Q1"이 작동했습니다.
if sed -i '/text I want to find / Q1' 파일.그런 다음 파일 끝에 빈 줄을 삽입합니다. + 새 줄 삽입 fi 빈 줄 없이 새 줄만 삽입하십시오.
언급URL : https://stackoverflow.com/questions/15965073/return-value-of-sed-for-no-match
'bestsource' 카테고리의 다른 글
스프링을 사용하여 옵션 경로 변수를 만들 수 있습니까? (0) | 2023.02.28 |
---|---|
ASP를 사용하는 Jquery AJAX.페이지 전체를 반환하는 NET Web Method (0) | 2023.02.28 |
PL/SQL 날짜에서 일수 빼기 (0) | 2023.02.28 |
SQL에 'LIKE'와 'IN'의 조합이 있습니까? (0) | 2023.02.28 |
JSON 파일을 TypeScript 파일로 Import하는 방법 (0) | 2023.02.28 |