
/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행과 일치합니다. 그런 다음 마지막 줄부터 다시 시작하여 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
$