/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/
다음 현재 주소에서 검색한 다음 pattern1
pattern2
현재 주소에서 검색합니다.현재 주소는 검색 간에 변경되지 않습니다.
따라서 검색할 때 /Delete/,/endif/
첫 번째 주소는 20행과 일치하고 마지막 행에서 다시 시작하여 endif
18행에서 일치합니다. 첫 번째 주소의 값은 두 번째 주소의 값을 초과할 수 없기 때문에 오류가 발생합니다.
해결책은 ;
구분된 주소를 사용하는 것입니다.
세미콜론으로 구분된 범위에서
.
두 번째 주소를 계산하기 전에 현재 주소( )를 첫 번째 주소로 설정합니다.
따라서 다음을 사용할 수 있습니다.
/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
$