web-dev-qa-db-ja.com

無効なアドレス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
4
Adam

最初のendifは最初のDeleteの前にあるため、edは「後方」に指定された範囲について混乱します。

最初にDeleteの最初の出現を見つけたいと思うでしょう、次にその行から次のendifにコマンドを適用します:

1,/Delete/
.,/endif/p

最初のコマンドは、Word Deleteを含むファイルの最初の行にカーソルを置き、2番目のコマンドは、その行からWordendifを含む次の行までの行を出力します。


viで同じコマンドを実行すると、「2番目のアドレスが最初のアドレスよりも小さい」と文句を言い、vimは「後方範囲を指定しました。スワップしてもOKですか(y/n)?」編集コマンドを与えるとき:/Delete/,/endif/p

sedは、2番目のアドレスの検索を開始する前に最初のアドレスを検索するため(ストリームエディターであるため)、問題は発生しません。

4
Kusalananda

エドには「 現在のアドレス ";」という概念があります。 .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行の前の空白行も削除します。

1
Benjamin W.

必要/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
$
0
steve