sed 명령을 사용할 때 종료 상태를 얻으려면 어떻게합니까? $? 1 그러나 사용해야 sed하고 종료

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옵션을 가지고 놀아야한다는 것을 알고 있지만 성공하지 못했다.



답변

당신은 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 확장이다).


답변

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 옵션을 사용하고 있습니다.