패턴을 찾을 수 없으면 sed를 실패하게 만드는 옵션이 있습니까?

패턴을 찾을 수 없으면 sed를 실패하게 만드는 옵션이 있습니까?

특정 파일에서 특정 패턴을 찾아서 바꿔야 하는데, 패턴을 찾을 수 없으면 1 또는 다른 값을 반환해야 합니다.

sed만 사용하여 이 작업을 수행할 수 있습니까? 아니면 패턴이 존재하는지 확인하기 위해 다른 명령을 사용해야 합니까?

어떤 제안이 있으십니까?

답변1

이 답변을 확인하십시오.sed파일이 변경되었는지 확인하는 방법.

요청한 내용과 거의 동일합니다. awk다른 파일과 diff두 개의 파일을 사용하거나 출력하는 것이 좋습니다.

답변2

Sed는 각 패턴 공간에 대한 명령을 순차적으로 처리합니다. 좋은 패턴을 검색하기 위해 주소 지정을 사용하는 경우 qsed의 명령을 사용하여 양수 값을 반환할 수 있습니다.

sed '/if-the-pattern-space-has-this/<do this command>' <file>

명령이 종료된 후(이 경우 구분됨 ;) 다음 명령이 실행됩니다(이전 패턴을 찾아서 종료하지 않은 경우).

마지막 명령은 $q 1sed 주소를 사용하며 달러 기호는 명령이 파일의 마지막 줄에서만 실행된다는 것을 나타냅니다. 파일의 마지막 줄에서 이미 좋은 패턴을 찾았다면 이미 종료한 것이므로 최후의 수단으로만 사용하십시오. 만약 그렇다면, 당신은 부정적인 패턴으로 돌아갈 것입니다.

> sed -n '/good-pattern/q 0;$q 1' <<< "bad-pattern"
> echo $?
1

> sed -n '/good-pattern/q 0;$q 1' <<< "good-pattern"
> echo $?
0

이는 파일 영역 내에서 패턴 일치를 찾기 위해 주소 지정을 사용하는 경우 유용할 수 있습니다. 이는 grep쉽게 표현하기 어렵습니다(공평하게 말하면 sed약간의 춤 없이는 할 수 없습니다).

^block:이 예에서는 빈 줄로 시작하고 끝나는 파일 부분을 찾고 crazy해당 블록 내에서 단어가 발견되면 true를 반환합니다.

sed -n '/^block:/,/^$/{/crazy/q 0};$q 1' <<END && echo -e "\n--------------\n FOUND" || echo "\n----------------\n NOT FOUND"
this thing
block:
   is crazy
END

--------------
 FOUND

^block:이 예에서는 to 범위 외부에 "crazy"라는 단어가 나열되므로 <empty line>false를 반환합니다.

> sed -n '/^block:/,/^$/{/crazy/q 0};$q 1' <<END && echo -e "\n--------------\n FOUND" || echo -e "\n----------------\n NOT FOUND"
this thing
block:

   is crazy
END

----------------
 NOT FOUND

일부 변경 사항이 적용되었는지 여부에 따라 양수 또는 음수를 반환하려면 다음과 같이 하는 것이 좋습니다.

.sed 파일:substitutions.sed

# Searching for the word "crayons", replace this
# with "pizza" to see a positive match.  The replacement
# word is "meanies", which you can also replace.
s/crayons/meanies/

# We print each line regardless of a pattern match
p

# If the most recent 's' command did a substitution, take
# the branch to the loop.
t loop

# If we're not on the last line, delete the pattern space and
# start processing the next line.
$!d

# This only happens on the last line.  If we get here, swap the
# last hold space in and then return positive or negative based
# on the content in the hold space.  The hold space should only
# have matching content if we matched once before and swapped
# the matching pattern into the hold space.
x
/meanies/q 0

# If we don't match the replacement pattern then return falsy.
q 1

# This loop is only taken on a positive match, effectively
# just swapping the most recent match into the hold space.
:loop
x

데이터 파일:data.txt

file has some                    
content, be kind pizza           
don't eat pizza after 8           
because of the pepperoni monsters

sed 명령:

sed -nf substitutions.sed data.txt && echo -e '\nGood' || echo -e '\nBad'

sed 명령은 -nsed 스크립트 끝에 도달할 때마다 패턴 공간이 인쇄되지 않음을 나타내는 데 사용됩니다. -f다음 파일에서 sed 명령을 읽었음을 나타냅니다.

미친 짓을 하고 싶다면 sed를 인터프리터로 사용하여 쉘 스크립트로 래핑할 수 있습니다( discover its location 사용 which sed). 간결성을 위해 이번에는 주석을 생략하고 대체 패턴을 "크레용"을 "피자"로 바꾸었습니다.

쉘 스크립트:sed.sh

#!/usr/bin/sed -nf
s/pizza/meanies/ 
p                
t loop           
$!d              
x                
/meanies/q 0     
q 1              
                 
:loop            
x                

옮기다:

> ./sed.sh data.txt
file has some
content, be kind meanies
don't eat meanies after 8
because of the pepperoni monsters

> echo $?
0

관련 정보