هروب اسم ملف DOS للاستخدام مع أوامر *nix
سؤال
أريد الهروب من اسم ملف DOS حتى أتمكن من استخدامه مع sed.لدي ملف دفعي DOS يشبه هذا:
set FILENAME=%~f1
sed 's/Some Pattern/%FILENAME%/' inputfile
(ملحوظة: %~f1
- يتوسع %1
إلى اسم مسار مؤهل بالكامل - C:\utils\MyFile.txt
)
لقد وجدت أن الخطوط المائلة العكسية في %FILENAME%
هم مجرد الهروب من الرسالة التالية.
كيف يمكنني مضاعفتهم حتى يهربوا؟
(لقد قمت بتثبيت cygwin لذا لا تتردد في استخدام أي أوامر *nix أخرى)
حل
الجمع بين اقتراحات جيريمي وألكساندرو نيدلكو ، واستخدام | للتحديد في أمر SED لدي
set FILENAME=%~f1
cygpath "s|Some Pattern|%FILENAME%|" >sedcmd.tmp
sed -f sedcmd.tmp inputfile
del /q sedcmd.tmp
المحلول
هذا سيفي بالغرض.إنه أمر فوضوي لأنه في ملفات BAT لا يمكنك استخدام set var=`cmd` كما يمكنك في نظام التشغيل Unix.حقيقة أن الصدى لا يفهم علامات الاقتباس هي أيضًا فوضوية، ويمكن أن تؤدي إلى مشاكل إذا 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
[تم التعديل]:أنا مندهش أنه لم ينجح بالنسبة لك.لقد قمت بتجربته للتو، وكان يعمل على جهازي.أنا أستخدم sed من http://sourceforge.net/projects/unxutils واستخدام cmd.exe لتشغيل تلك الأوامر في ملف الخفافيش.
نصائح أخرى
يمكنك المحاولة كبديل (من موجه الأوامر) ...
> cygpath -m c:\some\path
c:/some/path
كما يمكنك أن تتخيل، فإنه يحول الخطوط المائلة العكسية إلى خطوط مائلة.
@ ألكسندرو وجيريمي، شكرًا لمساعدتكم.كلاكما يحصل على أصوات مؤيدة
@ جيريمي
باستخدام طريقتك حصلت على الخطأ التالي:
السيد:-التعبير رقم 1، الحرف 8:الأمر `s 'غير منتهي
إذا كان بإمكانك تعديل إجابتك لجعلها تعمل فسأقبلها.(لصق الحل الخاص بي لا يحتسب)
تحديث: حسنًا، لقد قمت بتجربتها باستخدام UnixUtils ونجحت.(للإشارة، فإن UnixUtils الذي قمت بتنزيله كان بتاريخ 1 مارس 2007، ويستخدم الإصدار 3.02 من GNU sed، بينما يحتوي تثبيت Cygwin الخاص بي على إصدار GNU sed 4.1.5)