문제를 해결하기 위해 노력 중코드골프 홈페이지, 간단한 텍스트 교체를 시도해 보세요.
- 주어진 파일
coin.txt
1개의 단어를 포함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 문서에서 나온 경우 종료하고, 그렇지 않으면 "?"를 인쇄하고 명령 모드로 돌아갑니다.
파일의 단어가 두 패턴 모두와 일치할 수 없기 때문에 두 명령 중 하나가 실패하므로 ed
1행에서 일치하지 않거나 2행에서 일치하지 않기 때문에 종료됩니다.그것일치하지 않습니다(따라서 변경된 파일을 저장하기 전에 종료됩니다).
이러한 명령은 표준 입력(백슬래시 및 접미사 제외)을 통해 작동합니다.
printf '%s\n' 's/heads/1/' 's/tails/-1/' 'wq' | ed -s coin.txt
?
실패(리디렉션 가능) 의 결과로 s/heads/1/
stderr을 받게 되지만 교체는 모두 예상대로 발생합니다.
종료하기에 충분 .
하므로 후행 명령을 제거했습니다 .q
ed
해결 방법, 게시자: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
하지 않는 첫 번째 대체에서 명령 처리가 중지되기 때문에 작동하지 않을 수 있습니다.
입력 스크립트에서 오류가 발생하거나 파일에 데이터가 존재하지 않거나 외부 조건(예: 읽기 또는 쓰기 오류)으로 인해 오류가 감지된 경우:
표준 입력이 터미널 장치 파일인 경우 모든 입력을 플러시하고 새 명령을 읽어야 합니다.
표준 입력이 일반 파일인 경우
ed
0이 아닌 종료 상태로 종료되어야 합니다.
(그 말은POSIX 표준)
이 스크립트를 실행할 때 GNU에서 받은 오류는 ed
"불일치" 오류( H
스크립트에 명령을 먼저 삽입한 경우 표시됨)이므로 무시해도 됩니다.