/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发布于 2018-06-02 11:53:32
第一个endif发生在第一个Delete之前,因此ed对“向后”指定的范围感到困惑。
首先要查找Delete的第一次出现,然后将该命令从该行应用到下一个endif:
1,/Delete/
.,/endif/p第一个命令将光标放在包含单词Delete的文件的第一行,第二个命令将从该行打印到包含单词endif的下一行。
如果您要在vi中发出相同的命令,它会抱怨“第二个地址比第一个地址小”,而vim会要求“向后给定范围,可以交换(y/n)吗?”当授予编辑命令:/Delete/,/endif/p时。
在开始查找第二个地址(因为它是流编辑器)之前,sed不会出现问题,因为它会查找第一个地址。
发布于 2018-08-31 19:15:36
Ed有一个“当前地址”的概念;您可以在.n中看到它(打印当前行及其前面的数字)。当您打开一个文件时,它被设置为文件的最后一行。
如果使用正则表达式指定地址,则会得到匹配的当前地址的下一行,并在文件末尾环绕,因此在打开文件后,搜索将从第一行开始。
现在,如果使用/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这将使用address /Delete/-删除Delete行之前的空行。
https://unix.stackexchange.com/questions/447459
复制相似问题