ed 無效地址 macOS

ed 無效地址 macOS
/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(列印目前行及其前面的編號)來查看它。當您開啟檔案時,它被設定為檔案的最後一行。

如果使用正規表示式指定位址,則會獲得符合的目前位址的下一行,環繞在檔案末尾,因此開啟檔案後,搜尋會從第一行開始。

現在,如果您指定一個位址範圍其中,ed 首先從目前地址開始/pattern1/,/pattern2/搜索,然後從目前地址開始搜索。pattern1pattern2當前地址在兩次搜尋之間不會更改。

因此,當您搜尋 時/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
$

相關內容