
/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/
搜索,然後從目前地址開始搜索。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
$