bestsource

일치하지 않는 경우 sed 값 반환

bestsource 2023. 2. 28. 23:40
반응형

일치하지 않는 경우 sed 값 반환

하고 sedJSON을 사용하다파일에서 하지 않을 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/ 그 에 ( )이 있습니다.hPS에 의한 HS에 관한 것입니다.

sed는 sed ★$하기 위해 됩니다.그러면 일이 발생합니다

번째는 ★★★★x명령어는 2개의 레지스터를 스왑하기 때문에 HS가 PS가 되고 PS가 HS가 됩니다.

으로 PS에서 됩니다././ ).HS(일명 PS)입니다.이 " " " "x 뒤에 이 됩니다.q0를 "sed"로 합니다.0. 그 의 경우는, 「」를 참조해 주세요.x가 "귀환 코드"로 됩니다.1.

는 N.B. ,이지만qsed 처리를 종료해도 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/}'입니다.ffoob★★★★★★★★★★★★★★★★★★★★★★★★★★

입니다.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=Xabc11을 , 는 1을 설정합니다.g=abc12가 됩니다만, 이 두 입력 문자열은 모두 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

반응형