정규식이 일치하지 않는 경우 "sed"가 종료 상태를 반환하지 않는 이유는 무엇입니까?

정규식이 일치하지 않는 경우 "sed"가 종료 상태를 반환하지 않는 이유는 무엇입니까?

파일의 특정 줄을 검색하고 바꾸려고 하는데 실행 시 sed해당 정규식이 일치하지 않으면 상태 코드가 반환되지 않으므로 sed조건을 추가하는 대신 grepEnter 메서드가 있습니다 sed. sed종료 상태?

질문:

여기에 이미지 설명을 입력하세요.

답변1

sed 하다반환 종료 상태:

$ echo "foo" | sed 's/xx/yy/'
foo
$ echo $?
0
$ sed 's/xx/yy/' foo.txt
sed: can't read foo.txt: No such file or directory
$ echo $?
2

Sed의 종료 코드는 프로그램이 성공적으로 종료되었는지 여부와 관련이 있으며 수행 중인 작업의 내부와는 관련이 없으며 sed명령이 성공적으로 실행되었는지 여부만 관련됩니다.

즉, GNU sed는 이를 수행하는 방법을 제공합니다:

   q [exit-code]
          Immediately  quit  the sed script without pro‐
          cessing any more input, except that  if  auto-
          print  is  not  disabled  the  current pattern
          space will be printed.  The exit code argument
          is a GNU extension.

예를 들어 (에서 가져옴여기):

$  echo "foo"|sed '/foo/ s/f/b/;q'                                                                       
boo
$  echo $?
0
$ echo "trash"|sed  '/foo/{s/f/b/;q}; /foo/!{q100}'
trash
$  echo $?
100

다음 사실을 신고하고 싶으신 경우어느입력의 모든 라인에서 교체가 성공했습니다. 예약된 공간에 성공적인 교체를 표시하고 마지막 라인에서 확인할 수 있습니다.

seq 6 | sed 's/4/four/;s/5/five/; tm;${x;/1/{x;q};x;q1};b;:m;x;s/.*/1/;x'

tmm교체가 성공하면 레이블로 분기합니다. 여기에 1마지막 행에서 찾는 예약된 공간을 넣습니다 .

답변2

첫째, 모든 명령(포함 sed)은 종료 상태를 반환합니다. 당신은 내가 실패를 반환하지 않는 이유를 찾고 있습니다. 이는 두 번째 요점으로 이어진다.

이와 같은 프로그램은 sed술어가 아니라 편집자입니다. 그들의 목적은 프로그램을 통해 흐르는 데이터를 변경하는 것입니다. 오류 조건은 잘못된 내부 명령이나 명령줄에 존재하지 않는 파일과 같은 상황을 나타냅니다.

어떤 논리를 원하는지 잘 모르겠습니다. 예상되는 출력이 포함되어 있지 않습니다. 하지만 찾고 있는 것이 다음과 같을 수도 있습니다.

$ sed '/^test line 7/s//#test line 7/;/^#test line 7/s//& \nAppend New Line/' test.txt
test line 1
test line 2
test line 3
test line 4
test line 5
test line 6
#test line 7
Append New Line

b와 같이 이를 처리하는 다른 구조도 있습니다 sed.

실제 반환 코드를 찾을 수 없는 경우 gawk해당 exit선언을 살펴보는 것이 좋습니다.

관련 정보