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

에드에게 좋은 생각이 있어"현재 주소"; .n(현재 줄과 그 앞의 번호 인쇄)를 사용하여 볼 수 있습니다. 파일을 열면 파일의 마지막 줄로 설정됩니다.

정규식을 사용하여 주소를 지정하면 현재 주소와 일치하는 다음 줄이 파일 끝 부분에 표시되므로 파일이 열릴 때 첫 번째 줄에서 검색이 시작됩니다.

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

따라서 검색할 때 /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
$

관련 정보