ed 잘못된 주소 macOS

ed 잘못된 주소 macOS
/Delete/,/endif/p
?
invalid address
/Delere/,/endif/p
?
no match

라틴어만 이해한다는 뜻인가요?

/Dele/,/endif/p
?
invalid address
/Del/,/endif/p
?
invalid address

아니, 내가 뭘 잘못하고 있는 걸까? 저는 한 글자도 실수 없이 다 타이핑하고 있어요.

나는 macOS를 가지고 있습니다.

다음은 위 명령을 사용하여 편집할 때 동일한 동작을 보이는 편집 중인 파일의 샘플입니다 ed.

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Editing mappings
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Remap VIM 0 to first non-blank character
map 0 ^

" Move a line of text using ALT+[jk] or Command+[jk] on mac
nmap <M-j> mz:m+<cr>`z
nmap <M-k> mz:m-2<cr>`z
vmap <M-j> :m'>+<cr>`<my`>mzgv`yo`z
vmap <M-k> :m'<-2<cr>`>my`<mzgv`yo`z

if has("mac") || has("macunix")
  nmap <D-j> <M-j>
  nmap <D-k> <M-k>
  vmap <D-j> <M-j>
  vmap <D-k> <M-k>
endif

" Delete trailing white space on save, useful for some filetypes ;)

if has("autocmd")
    autocmd BufWritePre *.txt,*.js,*.py,*.wiki,*.sh,*.coffee :call CleanExtraSpaces()
endif

답변1

첫 번째는 endif첫 번째 이전에 발생하므로 Delete" ed뒤로" 지정되는 범위에 대해 혼란스러워집니다.

먼저 의 첫 번째 발생을 찾고 싶을 것입니다 Delete.그 다음에해당 줄부터 다음 줄까지 명령을 적용합니다 endif.

1,/Delete/
.,/endif/p

첫 번째 명령은 단어가 포함된 파일의 첫 번째 줄에 커서를 놓고 Delete두 번째 명령은 해당 줄부터 단어가 포함된 다음 줄까지의 줄을 인쇄합니다 endif.


에서 동일한 명령을 내리면 vi"두 번째 주소가 첫 번째 주소보다 작습니다"라고 불평하고 vim"뒤로 범위가 지정되었습니다. 교환해도 괜찮습니까(y/n)?"라고 묻습니다. 편집 명령을 내릴 때 :/Delete/,/endif/p.

sed두 번째 주소 찾기를 시작하기 전에 첫 번째 주소를 찾기 때문에 문제가 없을 것입니다(스트림 편집기이기 때문에).

답변2

Ed는 "현재 주소"; (번호가 앞에 붙은 현재 줄을 인쇄)로 볼 수 있습니다 .n. 파일을 열면 파일의 마지막 줄로 설정됩니다.

정규식을 사용하여 주소를 지정하면 일치하는 현재 주소 아래의 다음 줄을 가져오고 파일 끝에서 줄 바꿈하므로 파일을 연 후 첫 번째 줄에서 검색이 시작됩니다.

이제 주소를 지정하면범위with /pattern1/,/pattern2/, ed는 먼저 pattern1현재 주소에서 시작하여 검색한 다음 pattern2현재 주소에서 시작하여 검색합니다.두 검색 간에 현재 주소는 변경되지 않습니다.

따라서 를 검색하면 /Delete/,/endif/첫 번째 주소는 20행과 일치합니다. 그런 다음 마지막 줄부터 다시 시작하여 endif18번 줄에서 일치합니다. 첫 번째 주소의 값이 두 번째 주소의 값을 초과할 수 없기 때문에 오류가 발생합니다.

해결책은 ;주소를 구분하는 것입니다.

세미콜론으로 구분된 범위에서 현재 주소( .)는 두 번째 주소가 계산되기 전에 첫 번째 주소로 설정됩니다.

따라서 다음을 사용할 수 있습니다.

/Delete/;/endif/p

그러면 20~24행이 표시됩니다.

/Delete/;/endif/p
" Delete trailing white space on save, useful for some filetypes ;)

if has("autocmd")
    autocmd BufWritePre *.txt,*.js,*.py,*.wiki,*.sh,*.coffee :call CleanExtraSpaces()
endif

그리고 댓글에서 언급한 대로 삭제하려면 다음을 수행하세요.

ed infile <<'EOE'
/Delete/-;/endif/d
wq
EOE

이는 주소를 사용하여 줄 /Delete/-앞의 빈 줄도 제거합니다 Delete.

답변3

필요 /startrange/,/endrange/d. 예

$ cat inp
foo
Delete
these lines
endif
bar
$ ed inp
33
/Delete/,/endif/d
w
8
q
$ cat inp
foo
bar
$

나는 단지 다음을 사용할 것입니다 sed:

$ sed -i '/Delete/,/endif/d' inp
$

관련 정보