
/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
、2 番目のコマンドは、その行から単語 を含む次の行までの行を出力しますendif
。
で同じコマンドを実行するとvi
、「2 番目のアドレスが最初のアドレスより小さい」というエラーが表示され、vim
編集コマンドを実行すると、「逆方向の範囲が指定されました。スワップしてもよろしいですか (y/n)?」という質問が表示されます:/Delete/,/endif/p
。
sed
2 番目のアドレスの検索を開始する前に最初のアドレスを検索するため、問題は発生しません (ストリーム エディターであるため)。
答え2
エドは「現住所"; で確認できます.n
(現在の行の先頭に番号を付けて出力します)。ファイルを開くと、ファイルの最後の行に設定されます。
正規表現を使用してアドレスを指定すると、現在のアドレスの次の行がファイルの末尾で折り返されて一致するため、ファイルを開いた後、最初の行から検索が開始されます。
さて、住所を指定すると範囲を使用すると/pattern1/,/pattern2/
、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
。
答え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
$