해결 방법: 파일은 LF 개행 대신 CR을 사용하여 저장됩니다. Mosvy가 이 점을 지적했지만 답변이 아닌 댓글로만 게시했기 때문에 원인을 찾고 문제를 해결할 수 있도록 도와주신 것에 대해 공식적으로 감사를 표할 수는 없습니다.
mosvy님, 감사합니다. 다시 오시면 제가 엄지손가락을 치켜세울 수 있도록 답변을 게시해 주세요.
SED에는 다음이 있는 것 같습니다.
sed '3,10d;/<ACROSS>/,$d' input.txt > output.txt
(3-10행을 삭제한 다음 "<ACROSS>"가 포함된 행부터 파일 끝까지 삭제한 다음 출력을 작성합니다.)
그냥 시도해도:
sed '3,10d' input.txt > output.txt
하지만 어떤 이유에서인지 내 Mac에서는 두 방법 모두 작동하지 않는 것 같습니다.
무엇을 더 시도해야 할지 모르겠습니다.
AWK에도 비슷한 것이 있었으면 좋겠습니다.
고쳐 쓰다:
내가 입력할 때:
sed '3,10d' input.txt > output.txt
3~10행은 삭제되지 않습니다. 단지 전체 파일을 output.txt로 반환합니다.
내가 시도할 때:
sed '/<ACROSS>/,$d' input.txt > output.txt
Output.txt가 비어 있습니다.
또한 저는 10.9.4를 사용하고 있습니다.
** 업데이트 2:
고마워요 모비! ! 귀하의 의견에 찬성 투표를 할 수 있었으면 좋겠습니다. 이것이 문제 해결사입니다.
파일은 LF 개행 대신 CR로 저장되었습니다.
변환하니 다 해결됐네요.
기여해주신 모든 분들께 감사드립니다.
답변1
/usr/bin/sed '3,10d'
내 Mac(Mojave)에서 잘 작동합니다. 그럼에도 불구하고 awk를 사용하면:
awk '(NR >= 3) && (NR <= 10) {next} /<ACROSS>/{exit} 1'
...줄 번호가 3에서 10 사이이면 줄을 건너뛰고 가 있는 <ACROSS>
줄에 도달하면 종료됩니다(다른 모든 항목은 인쇄됩니다).
답변2
귀하의 sed는 잘 작동합니다. 그럼에도 불구하고 Awk에는 여전히 ,
--"Between" 연산자 가 있습니다. 다음은 몇 가지 예입니다(기본 작업 = 인쇄).
"start"와 "stop" 사이의 줄을 인쇄하세요.
awk '/start/,/stop/'
3호선과 10호선 사이의 노선
awk 'NR==3, NR==10'
<ACROSS>
줄 사이와 끝
awk '/<ACROSS>/, 0'
(0은 거짓이므로 끝나지 않습니다)
답변3
OP의 문제는 예상대로 줄 종결자로 CR
( \r
/ascii 10) 대신 LF
( /ascii 13)을 사용하는 파일로 인해 발생합니다 . using은 Mac을 사용 하지 않는 사용자로서 클래식 MacOS에서 사용 되는 규칙입니다. 지난 20년 동안 제가 경험한 유일한 용도는 PDF 파일에서 입니다 . in은 정규 표현식이 될 수 없습니다).\n
sed
CR
perl
RS
mawk
gawk
$/
perl
제목의 질문에 따르면, 그렇습니다. awk
범위 모드가 지원되며 정규식과 줄 번호 조건부(또는 모든 표현식)를 자유롭게 혼합할 수 있습니다. 예를 들어:
NR==1,/rex/ # all lines from the 1rst up to (and including)
# the one matching /rex/
/rex/,0 # from the line matching /rex/ up to the end-of-file.
awk
마지막 술어가 범위를 시작하는 행과도 일치할 수 있으므로 sed
범위 는 범위와 다릅니다 . 의 동작은 다음과 같이 시뮬레이션할 수 있습니다.awk
sed
s=/start/, !s && /last/ { s = 0; print }
그러나 in의 범위는 awk
실제로 표현식이 아니기 때문에 여전히 매우 제한적입니다(부정할 수 없고 다른 표현식의 일부가 될 수 없으며 in에서 사용할 수 없음 if(...)
등). 또한 이것은 마술이 아닙니다. 범위와 같은 것을 표현하기 위해 "컨텍스트"를 사용하려는 경우(예 /start/-4,/end/+4
: ) 자체 순환 버퍼와 추가 논리를 롤링해야 합니다.