다중 검색/바꾸기를 사용하는 ed(1) 스크립트

다중 검색/바꾸기를 사용하는 ed(1) 스크립트

문제를 해결하기 위해 노력 중코드골프 홈페이지, 간단한 텍스트 교체를 시도해 보세요.

  • 주어진 파일coin.txt1개의 단어를 포함 heads하거나tails
  • ed스크립트 가 있습니다flip.ed다음과 같이:
s/heads/1/n\
s/tails/-1/n\
wq
.
  • 그런 다음 터미널(macos, zsh)에서 다음과 같이 실행합니다. (각 "에드 마스터리", 111 장)
[~/골프/에드]λ에드 코인.txt < 플립캣 코인.txt;  
6
?
꼬리

스크립트 tails-1./bin/ed/usr/local/bin/ged​둘 다 여러 대체를 수행할 수 없는 것 같습니다.

이것은TIO.run의 예, 제 생각에는 GNU 버전을 실행하고 있는 것 같습니다.

ed내 스크립트에 문제가 있나요? 여전히 전력 버그ed??

고쳐 쓰다

해결책, 예의@ed1conf트위터에서. 접두사를 사용하면 g일치하는 줄만 대체되므로 원래 스크립트를 손상시키는 오류를 피할 수 있습니다. 온라인으로 사용해 보세요!

g/heads/s//1/
g/tails/s//-1/
wq
.

답변1

이렇게 할 수 있지만 리디렉션이나 일반 파일을 통해 명령을 보낼 수는 없습니다.

~에서GNU 편집 온라인 매뉴얼:

오류가 발생하면 ed에 대한 입력이 일반 파일이나 here 문서에서 나온 경우 종료하고, 그렇지 않으면 "?"를 인쇄하고 명령 모드로 돌아갑니다.

파일의 단어가 두 패턴 모두와 일치할 수 없기 때문에 두 명령 중 하나가 실패하므로 ed1행에서 일치하지 않거나 2행에서 일치하지 않기 때문에 종료됩니다.그것일치하지 않습니다(따라서 변경된 파일을 저장하기 전에 종료됩니다).

이러한 명령은 표준 입력(백슬래시 및 접미사 제외)을 통해 작동합니다.

printf '%s\n' 's/heads/1/' 's/tails/-1/' 'wq' | ed -s coin.txt

?실패(리디렉션 가능) 의 결과로 s/heads/1/stderr을 받게 되지만 교체는 모두 예상대로 발생합니다.

종료하기에 충분 .하므로 후행 명령을 제거했습니다 .qed


해결 방법, 게시자:ed(1) 트위터 컨퍼런스, 예:

g/heads/s//1/
g/tails/s//-1/
wq

또는 다음 섹션에 약어가 없습니다 s///.

g/heads/s/heads/1/
g/tails/s/tails/-1/
wq

이러한 변형은 g대체가 수행되지 않더라도 명령이 실패하지 않기 때문에 작동합니다.

답변2

그것으로 sed당신은 이것을 할 수 있습니다

sed 's/heads/tails/;t;s/tails/heads/'

에서 ed해당 t명령은 완전히 다른 명령이며 "가장 최근 대체 항목이 작업을 수행하는 경우 분기"되지 않습니다.

GNU를 사용하면 ed다음을 수행할 수 있습니다.

printf '%s\n' '1s/heads/T/' '1s/tails/H/' '1s/H/heads/' '1s/T/tails/' 'wq' | ed -s coin.txt

하지만 BSD에서는 일치 ed하지 않는 첫 번째 대체에서 명령 처리가 중지되기 때문에 작동하지 않을 수 있습니다.

입력 스크립트에서 오류가 발생하거나 파일에 데이터가 존재하지 않거나 외부 조건(예: 읽기 또는 쓰기 오류)으로 인해 오류가 감지된 경우:

  • 표준 입력이 터미널 장치 파일인 경우 모든 입력을 플러시하고 새 명령을 읽어야 합니다.

  • 표준 입력이 일반 파일인 경우 ed0이 아닌 종료 상태로 종료되어야 합니다.

(그 말은POSIX 표준)

이 스크립트를 실행할 때 GNU에서 받은 오류는 ed"불일치" 오류( H스크립트에 명령을 먼저 삽입한 경우 표시됨)이므로 무시해도 됩니다.

관련 정보