web-dev-qa-db-ja.com

Windowsでバックスラッシュを検索して置換し、スラッシュを転送します

最近、バージョン管理システムから新しい追跡されていないファイルを削除する必要がありました。 Linuxを使用している場合:

hg status -un|xargs rm

そして、それはうまく機能しますが、Windowsでそれを行う場合、hg statusは、バックスラッシュ付きのパスを一覧表示するため、問題が発生します。だから私は試してみます:

hg status -un|sed 's/\\/\//g'

...しかし、エラーが発生します:sed:-e式#1、文字8:終了していない `s 'コマンド

それから私はいくつかのASCIIを試します:

`hg status -un|sed 's/\o134/\o57/g'` 

...それは私を取得します:sed:-e式#1、文字14:末尾の円記号

そしていくつかのスクリプト:

hg status -un|sed 's/`echo \`/`echo /`/g'

...それは私を得る:sed:-e式#1、char 19: `s 'への不明なオプション

他のキャラクターで最後まで試してみると、期待どおりの出力が得られます...だから私は完全に迷子になっています。もちろん、私はcygwinを持っていますが、ファイルの使用は避けたいと思っています(これは私がやってきたことです)。

前もって感謝します

3
dukeofgaming

デューク!、あなたはそれを間違っています!、正規表現に:の代わりに/を使用できます:

hg status -un|sed 's:\\:/:g'

* facepalm *

2
dukeofgaming

'Trailing backslash'エラーを回避するには、最後のバックスラッシュを削除しないようにする必要があります。これは、正規表現で、置き換えられる文字の後に別の「非」バックスラッシュ文字が常に続くようにすることで実行できます。 sedは次のようになります...

sed "s:\\([^\]\+\):/\1:g"

..これは大まかに次のように解釈されます:

バックスラッシュの後にバックスラッシュではない文字を少なくとも1つ見つけ、スラッシュの後に他の一致する文字を続けて置き換えます。

正規表現(bashの場合)では、円記号をエスケープする必要はありませんでしたが、中括弧をエスケープする必要がありました。 '\ 1'はバックリファレンスです。

それが理にかなっていることを願っています!

0
Mike