/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
first
endif
出现在 first 之前Delete
,因此ed
对“向后”指定的范围感到困惑。您需要先找到第一次出现的
Delete
,然后将该行的命令应用到下一行endif
:第一个命令会将光标放在包含单词的文件的第一行,
Delete
第二个命令将从该行向下打印到包含单词的下一行endif
。如果您在 中给出相同的命令
vi
,它会抱怨“第二个地址小于第一个”,并vim
会询问“给定的向后范围,可以交换 (y/n)?” 给出编辑命令时:/Delete/,/endif/p
。sed
不会有问题,因为它在开始寻找第二个地址之前先寻找第一个地址(因为它是流编辑器)。埃德有一个“当前地址”的概念;你可以看到它
.n
(打印当前行,前面加上它的数字)。当您打开文件时,它被设置为文件的最后一行。如果您使用正则表达式指定地址,您将获得当前匹配地址的下一行,在文件末尾环绕,因此在打开文件后,搜索从第一行开始。
现在,如果您使用 指定一个地址范围,
/pattern1/,/pattern2/
ed 首先从当前地址开始搜索pattern1
,然后pattern2
从当前地址开始搜索。当前地址在两次搜索之间没有改变。因此,当您搜索时
/Delete/,/endif/
,第一个地址匹配第 20 行;然后,我们再次从最后一行开始,endif
在第 18 行匹配。因为第一个地址的值不能超过第二个地址的值,所以会出错。解决方案是使用
;
分隔地址:所以你可以使用这个:
你得到第 20-24 行:
并删除它们,正如评论中提到的:
这使用地址
/Delete/-
也删除了该行之前的空白Delete
行。需要
/startrange/,/endrange/d
。例子我只是使用
sed
: