sed 명령을 사용할 때 종료 상태를 얻으려면 어떻게합니까?


11

grep명령은 종료 상태를 제공합니다 :

$echo "foo.bar" | grep -o foo
foo
$echo $?
0
$echo "foo.bar" | grep -o pop
$echo $?
1  

그러나 사용해야 sed하고 종료 상태가 없음을 깨달았습니다.

$echo "foo.bar" | sed 's/bar.*$//'
foo.
$echo $?
0
$echo "foo.bar" | sed 's/pop.*$//'
foo.bar
$echo $?
0  

나는 -q옵션을 가지고 놀아야한다는 것을 알고 있지만 성공하지 못했다.


7
sed가장 확실하게 종료 상태를 가지고, 그냥 당신이 여기에서 필요하지 않습니다. sed예를 들어, 쓰기 액세스 권한이 없거나 존재하지 않는 파일 에서 명령을 실행하려고하면 sed0이 아닌 종료 상태로 종료됩니다. 종료 상태는 sed사용자가 지시 한 작업을 수행했는지, echo "foo.bar" | sed 's/pop.*$//'제대로 실행되었는지 를 나타냅니다 . 로 모든 줄을 삭제했습니다 pop. 그런 줄이 없었기 때문에 명령은 여전히 ​​효과가있었습니다.
terdon

@ 잔나 나는 대답을 게시하려고했지만 이것이 실제로 질문에 대답하지 않는다고 느꼈습니다. 오해 만 설명하지만 스틸 드라이버와 같은 유용한 솔루션을 제공하지는 않습니다. 따라서 의견이 더 적절 해 보였습니다.
terdon

답변:


13

당신은 Q를 사용할 수 없음 종료 상태로 종료 N -하지만 유용하게하기 위해, 당신은 또한 일부 사용할 필요가 분기 및 흐름 제어 :

t 마지막 입력 행을 읽거나 다른 조건부 분기를 수행
한 후 s///명령이 성공한 경우에만 조건부 분기 (즉, 레이블 로 이동).

표준 종료 상태 값 중 하나와 다른 n 값을 선택하는 것이 가장 좋습니다 .

종료 상태가 0이면 성공을 나타내고 0이 아닌 값은 실패를 나타냅니다. GNU 'sed'는 다음과 같은 종료 상태 오류 값을 반환합니다.

0
 Successful completion.

1
 Invalid command, invalid syntax, invalid regular expression or a
 GNU 'sed' extension command used with '--posix'.

2
 One or more of the input file specified on the command line could
 not be opened (e.g.  if a file is not found, or read permission is
 denied).  Processing continued with other files.

4
 An I/O error, or a serious processing error during runtime, GNU
 'sed' aborted immediately.

예를 들어

$ echo "foo.bar" | sed 's/bar.*$//; t; q42' ; echo $? 
foo.
0

이므로

$ echo "foo.bar" | sed 's/baz.*$//; t; q42' ; echo $? 
foo.bar
42

당신이 패턴 영역의 기본 인쇄를 생략 할 경우, 교체 q에 의해 Q(주 QGNU 확장이다).


1

sed로 정규 표현식을 검색하고 match를 강조 표시 하거나 일치하는 항목이 없으면 종료 코드 (5)를 반환 하는 방법은 다음과 같습니다 .

이것은 input.txt입니다.

hello there
my dear old friend
a lot of things
we'll pass along the end

다음은 모두 인쇄 + 하이라이트 일치 + 리턴 종료 코드 기능입니다.

highlight()
{
  pattern=$1
  shift
  sed '/'"${pattern}"'/,${s//\x1b[32m&\x1b[0m/g;b};$q5' "$@"
}

$ "lo \ | end"를 강조 표시합니다. input.txt || echo -e "\ n * 일치하는 항목이 없습니다 *"

HEL 보라
나의 친애하는 오래된 금은 종료 싸다 일의 t을 우리가 통과 할 것 보라끝을

일치하지 않으면 종료 코드 (5)를 반환합니다. 고양이와 파이프와 함께 사용할 수 있습니다 | 게다가:

$ 고양이 input.txt | "hot \ | and"강조 표시 || echo -e "\ n * 일치하는 항목이 없습니다 *"

안녕
내 오랜 친구 우리가 끝까지 통과 할
많은 것들

* 일치하는 항목이 없습니다 *

https://unix.stackexchange.com/a/405725/43233 덕분에 + sed quit 옵션을 사용하고 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.