3

sed で使用できるように DOS ファイル名をエスケープしたい。次のようなDOSバッチファイルがあります。

set FILENAME=%~f1

sed 's/Some Pattern/%FILENAME%/' inputfile

(注: -完全修飾パス名に%~f1展開されます - )%1C:\utils\MyFile.txt

%FILENAME%バックスラッシュが次の文字をエスケープしているだけであることがわかりました。

それらがエスケープされるように、どうすればそれらを2倍にすることができますか?

(私は cygwin をインストールしているので、他の *nix コマンドを自由に使用してください)

解決

Jeremy と Alexandru Nedelcu の提案を組み合わせて | を使用する 私が持っているsedコマンドの区切り文字について

set FILENAME=%~f1
cygpath "s|Some Pattern|%FILENAME%|" >sedcmd.tmp
sed -f sedcmd.tmp inputfile
del /q sedcmd.tmp
4

3 に答える 3

2

これは機能します。Unix のように set var=`cmd` を BAT ファイルで使用できないため、面倒です。echo が引用符を理解しないという事実も厄介で、Some Patternシェルのメタ文字が含まれていると問題が発生する可能性があります。

set FILENAME=%~f1
echo s/Some Pattern/%FILENAME%/ | sed -e "s/\\/\\\\/g" >sedcmd.tmp
sed -f sedcmd.tmp inputfile
del /q sedcmd.tmp

[編集]: うまくいかなかったことに驚いています。テストしたところ、私のマシンで動作しました。http://sourceforge.net/projects/unxutilsのsed を使用し、cmd.exe を使用してこれらのコマンドをバット ファイルで実行しています。

于 2008-08-29T21:58:36.340 に答える
2

代わりに(コマンドプロンプトから)試すことができます...

> cygpath -m c:\some\path
c:/some/path

ご想像のとおり、バックスラッシュをスラッシュに変換します。

于 2008-08-29T22:00:20.000 に答える
0

@ Alexandru&Jeremy、ご協力いただきありがとうございます。あなたは両方とも賛成票を獲得します

@ジェレミー

あなたの方法を使用すると、次のエラーが発生しました:

sed:-e式#1、char 8:終了していない`s'コマンド

あなたがそれを機能させるためにあなたの答えを編集することができれば、私はそれを受け入れます。(私のソリューションを貼り付けることはカウントされません)

更新:わかりました。UnixUtilsで試してみましたが、機能しました。(参考までに、ダウンロードしたUnixUtilsの日付は2007年3月1日で、GNU sedバージョン3.02を使用しています。Cygwinのインストールには、GNU sedバージョン4.1.5が含まれています)

于 2008-08-29T22:29:58.790 に答える