/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
最初のendif
は最初のDelete
の前にあるため、ed
は「後方」に指定された範囲について混乱します。
最初にDelete
の最初の出現を見つけたいと思うでしょう、次にその行から次のendif
にコマンドを適用します:
1,/Delete/
.,/endif/p
最初のコマンドは、Word Delete
を含むファイルの最初の行にカーソルを置き、2番目のコマンドは、その行からWordendif
を含む次の行までの行を出力します。
vi
で同じコマンドを実行すると、「2番目のアドレスが最初のアドレスよりも小さい」と文句を言い、vim
は「後方範囲を指定しました。スワップしてもOKですか(y/n)?」編集コマンドを与えるとき:/Delete/,/endif/p
。
sed
は、2番目のアドレスの検索を開始する前に最初のアドレスを検索するため(ストリームエディターであるため)、問題は発生しません。
エドには「 現在のアドレス ";」という概念があります。 .n
で確認できます(現在の行に番号を付加して印刷します)。ファイルを開くと、ファイルの最後の行に設定されます。
正規表現を使用してアドレスを指定すると、一致する現在のアドレスの下の次の行が取得され、ファイルの最後で折り返されるため、ファイルを開いた後、検索は最初の行から開始されます。
ここで、/pattern1/,/pattern2/
を使用してアドレスrangeを指定すると、edは最初に現在のアドレスからpattern1
を検索し、次にpattern2
現在のアドレスから開始します。 現在のアドレスは2つの検索間で変更されません。
したがって、/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
行の前の空白行も削除します。
必要/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
$