সেড দিয়ে একটি ব্যাকস্ল্যাশ প্রতিস্থাপন করুন


3

আমি এমন একটি স্ক্রিপ্ট তৈরি করার চেষ্টা করছি যা প্রতিটি ঘটনাকে C:\দুটি ভিন্ন ধরণের ফাইলের দ্বারা প্রতিস্থাপন করে /root

আমার আরবোরসেন্স দেখতে দেখতে:

- Batch
  - Place of the script
- Conf
  - Appli1
    - File1.xml
    - File2.xml
    - ...
  - Appli2
    - File1.xml
    - File2.xml
    - ...
  - ...
- Info
  - File1.conf
  - File2.conf
  - ...

আমার স্ক্রিপ্টটি এর মতো /Batch:

#/bin/bash
find ../ -name "*.xml" -o name "*.conf" -print | xargs sed -i 's C:\ /root/ g'

তবে, আমার উপর একটি ত্রুটি রয়েছে sed part, যা এটি বলেcharacter 14: command 's' unfinished

কেন যে এত?

উত্তর:


4

আপনি যেখানে ব্যবহার করবেন:

sed -i 's C:\ /root/ g'

আপনি sকমান্ডটির বিভিন্ন অংশ পৃথক করে একটি স্পেস অক্ষর সহ কমান্ডটি ব্যবহার করছেন , যা অস্বাভাবিক, তবে সম্পূর্ণ বৈধ। আপনি যখন নিজের বিভাজক চরিত্রটিকে ব্যাকস্ল্যাশের সাথে আগে রাখেন, যদিও এটি বিভাজক হিসাবে বিবেচিত হয় না, তবে যুক্তির অংশ হিসাবে।

সমস্যা এখানে আছে যে ব্যাকস্ল্যাশ হয় C:\মাঝখানে স্পেস পলায়নের হয়, তাই sনা প্রতিস্থাপন শেষে (যা এখন খুঁজে বের করে g) এবং অভিযোগ যে কমান্ড অসমাপ্ত, কারণ তোমাকে দেখেছিলাম।

অন্ততপক্ষে, আপনাকে অন্য ব্যাকস্ল্যাশ দিয়ে নিজেই ব্যাকস্ল্যাশ থেকে বাঁচতে হবে:

sed -i 's C:\\ /root/ g'

এটি কাজ করবে, যদিও অন্য একটি চরিত্রের সাথে স্পেসগুলি প্রতিস্থাপন করা আরও পরিষ্কার হতে পারে।


আপনার ব্যবহার xargsএবং সাব ডিরেক্টরি ডিরেক্টরি হিসাবে - xargsএখানে প্রয়োজন হয় না, এবং findএটি নিজের ডিরেক্টরিতে সাব-ডিরেক্টরিতে ফাইল পরিচালনা সহ এটি করতে পারেন। ব্যবহার করুন:

find ../ \( -name "*.xml" -o -name "*.conf" \) -exec sed -i -e 's|C:\\|/root/|g' '{}' +

এটি খুঁজে পাওয়া সমস্ত ফাইলের সাথে কমান্ডটি নিজে findচালাতে পারে sed। ফাইলের নামগুলি এর জায়গায় sertedোকানো হয় {}এবং এর +অর্থ findএটি কমান্ডটি চালানোর পরিমাণকে কমিয়ে দেয়।

-execdirম্যান পৃষ্ঠাতে-exec বর্ণিত কিছু সুরক্ষিত কারণে এর চেয়ে ভাল হতে পারে ; এটি একটি মানহীন এক্সটেনশন, তবে আপনার মনে হচ্ছে যে আপনি জিএনইউ সরঞ্জামগুলি ব্যবহার করছেন এটি আপনার প্রয়োজন হলে এটি আপনার উচিত।find


শুধু একটি সমস্যা আছে। আমি মনে করি আপনি আপনার আদেশে নামের আগে একটি "-" মিস করেছেন miss "-" ছাড়া আমি কমান্ডটি খারাপভাবে ব্যবহার করার জন্য একটি ত্রুটি পেয়েছি। আমি যখন উভয় "-o -names" রাখি, কমান্ডটি কেবল সর্বশেষটি গ্রহণ করে ... এটি কি স্বাভাবিক?
বেনামে

প্রকৃতপক্ষে! দুঃখিত, আমি কীভাবে এ থেকে মুক্তি পেয়েছি জানি না। এখনই স্থির। আপনার কি -
মাইকেল হোমার

হ্যাঁ, তবে, তবুও, কমান্ডটি কেবলমাত্র সর্বশেষ-নামটি বিবেচনা করে কেন গ্রহণ করে? আমি কিছু ভুল করেছি?
বেনামে

আপনাকে .find ../ \( -name "*.xml" -o -name "*.conf" \)শেষ পরীক্ষা হিসাবে যেমন পরীক্ষাগুলি প্যারেন্টাইসাইজ করতে হবে। দুঃখিত, আমি আপনার আদেশটি অনুলিপি করে দিয়েছি এবং এর অংশটির পক্ষে যথেষ্ট মনোযোগ দিচ্ছি না। অন্যথায় -execকেবল দ্বিতীয় শাখার সাথে জুটিবদ্ধ হয়।
মাইকেল হোমার

প্রতিধ্বনি "সি: \\" | সেড-ই / এস / সি: \\ / \ / রুট / জি '
c4f4t0r

2

এটা ব্যাকস্ল্যাশ। ব্যাকস্ল্যাশ পরবর্তী চরিত্রটিকে অকার্যকর করে তোলে এবং এটি বিশেষ অর্থ হারাতে সক্ষম করে। সেড কমান্ডটি আপনি কী টাইপ করেছেন তা পড়ছে (কেবলমাত্র সেড এক্সপ্রেশন, আমি এখানে পুরো ক্লান্তিকর শেল কমান্ড লাইনটি করছি না):

s
<SPACE>
C
:
Literal <SPACE>
/root/
<SPACE>

আপনি সেডকে বলেছেন যে আপনি যে অভিব্যক্তিটি সন্ধান করছেন এবং এর প্রতিস্থাপন তা আপনি চিহ্নিতকারী হিসাবে ব্যবহার করতে চান। তবে সেড এমন কিছু দেখার আশা করছেন:

s
<SPACE>
C
:
Literal \
<SPACE>
/root/
<SPACE>

ব্যাকস্ল্যাশকে আক্ষরিক ব্যাকস্ল্যাশ করতে, এটি ব্যাকস্ল্যাশ দিয়ে প্রিপেন্ড করুন:

sed -e 's C:\\ /root '

ব্যক্তিগতভাবে, আমি কোনও স্থান ব্যবহার করা এড়াতে পছন্দ করব। আমি এর মতো কিছু ব্যবহার করতাম |, বা ;। তবে আপনার এখনও ব্যাকস্ল্যাশ নিয়ে সমস্যা আছে। আসলেই মজাদারটি কী কাজ করছে তা আপনাকে বিভাজক হিসাবে ব্যাকস্ল্যাশ ব্যবহার করতে টাইপ করতে হবে। :)


আমি বলব 's \\\ C: \\\\\\\ / root / \\\ g'
বেনামে

@ এক্সাল্টার - আপনি শেল প্রসেসিং এবং সেড প্রসেসিং বিভ্রান্ত করছেন। শেড ব্যাকস্ল্যাশকে বিভাজক হিসাবে দেখেন এবং বিশেষ অর্থটিকে অস্বীকার করেন। sed -e 's\c:\foo\'সি: foo মধ্যে পরিবর্তন হবে। আর ব্যাকস্ল্যাশ হিসাবে আপনি আসলে ব্যাকস্ল্যাশের সাথে মিল রাখতে পারবেন না। যদিও শেড এক্সপ্রেশনটির চারপাশে উদ্ধৃতিগুলি হারিয়ে ফেলুন এবং আপনার দরকার `সেড-সি \\ সি: \\ ফু \\`, কারণ ব্যাকস্ল্যাশ শেল কমান্ড প্রসেসিংয়ের সাথে প্রকাশিত হয়েছে।
JezC
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.