/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
最初のコマンドは単語を含むファイルの最初の行にカーソルを置き、2番目のDelete
コマンドはその行から単語を含む次の行までの行を印刷しますendif
。
で同じコマンドを発行するvi
と、「2番目のアドレスが最初のアドレスより小さいです」というメッセージが表示され、編集コマンドを実行するvim
と「リバース範囲が与えられたら(y / n)を変更できますか?」と尋ねます:/Delete/,/endif/p
。
sed
2番目のアドレスを探し始める前に、最初のアドレスを探すので問題はありません(ストリームエディタなので)。
答え2
エドに良い考えがある」現在の住所.n
(現在の行とその前の番号の印刷)を使用して表示できます。ファイルを開くと、ファイルの最後の行に設定されます。
正規表現を使用してアドレスを指定すると、現在のアドレスと一致する次の行がファイルの末尾に表示されるため、ファイルが開かれると最初の行で検索が開始されます。
今アドレスを指定すると範囲with 、 ed は最初に現在のアドレスから検索し、次に現在の/pattern1/,/pattern2/
アドレスから検索し、次に現在のpattern1
pattern2
アドレスから検索します。現在の住所は検索間で変更されません。
したがって、検索すると、/Delete/,/endif/
最初のアドレスは20行に一致し、最後の行から再開してendif
18行に一致します。最初のアドレスの値は2番目のアドレスの値を超えることができないため、エラーが発生します。
解決策は;
区切りアドレスを使用することです。
セミコロンで区切られた範囲で
.
2番目のアドレスを計算する前に、現在のアドレス()を最初のアドレスに設定します。
したがって、次のものを使用できます。
/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
$