首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ed无效地址macOS

ed无效地址macOS
EN

Unix & Linux用户
提问于 2018-06-02 10:16:36
回答 2查看 213关注 0票数 4
代码语言:javascript
复制
/Delete/,/endif/p
?
invalid address
/Delere/,/endif/p
?
no match

这是否意味着它只懂拉丁语?

代码语言:javascript
复制
/Dele/,/endif/p
?
invalid address
/Del/,/endif/p
?
invalid address

不,我做错什么了?我把所有的字母都打出来了,没有任何错误。

我有macOS。

下面是我正在编辑的文件中的一个示例,它在使用上面的ed命令编辑它时表现出相同的行为:

代码语言:javascript
复制
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => 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
EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2018-06-02 11:53:32

第一个endif发生在第一个Delete之前,因此ed对“向后”指定的范围感到困惑。

首先要查找Delete的第一次出现,然后将该命令从该行应用到下一个endif

代码语言:javascript
复制
1,/Delete/
.,/endif/p

第一个命令将光标放在包含单词Delete的文件的第一行,第二个命令将从该行打印到包含单词endif的下一行。

如果您要在vi中发出相同的命令,它会抱怨“第二个地址比第一个地址小”,而vim会要求“向后给定范围,可以交换(y/n)吗?”当授予编辑命令:/Delete/,/endif/p时。

在开始查找第二个地址(因为它是流编辑器)之前,sed不会出现问题,因为它会查找第一个地址。

票数 4
EN

Unix & Linux用户

发布于 2018-08-31 19:15:36

Ed有一个“当前地址”的概念;您可以在.n中看到它(打印当前行及其前面的数字)。当您打开一个文件时,它被设置为文件的最后一行。

如果使用正则表达式指定地址,则会得到匹配的当前地址的下一行,并在文件末尾环绕,因此在打开文件后,搜索将从第一行开始。

现在,如果使用/pattern1/,/pattern2/指定地址范围,ed首先从当前地址开始搜索pattern1,然后从当前地址开始搜索pattern2。当前地址不会在两个搜索之间更改。

因此,当您搜索/Delete/,/endif/时,第一个地址与第20行匹配;然后,我们再次从最后一行开始,而endif匹配在第18行。因为第一个地址的值不能超过第二个地址的值,所以会出现一个错误。

解决方案是使用;来分离地址:

在分号分隔范围内,在计算第二个地址之前,将当前地址(.)设置为第一个地址。

所以你可以用这个:

代码语言:javascript
复制
/Delete/;/endif/p

你可以看到第20-24行:

代码语言:javascript
复制
/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

并删除评论中提到的:

代码语言:javascript
复制
ed infile <<'EOE'
/Delete/-;/endif/d
wq
EOE

这将使用address /Delete/-删除Delete行之前的空行。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/447459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档