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
(주 Q
GNU 확장이다).
답변
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 옵션을 사용하고 있습니다.