সেড দিয়ে কোনও ফাইলের উদ্ধৃতি চিহ্নগুলি কীভাবে প্রতিস্থাপন করবেন?


10

আমার কাছে এমন একটি ফাইল রয়েছে যাতে এক্সএমএল এর একাধিক লাইন থাকে। আমি ফাইলের কিছু অংশ প্রতিস্থাপন করতে চাই। ফাইলের কিছু অংশে উদ্ধৃতি চিহ্ন রয়েছে ( ") যা আমি প্রতিস্থাপন করতে চাই। আমি এর সাথে উদ্ধৃতি চিহ্নটি এড়াতে চেষ্টা করেছি \, তবে আমার ফাইলের ফলাফলের ভিত্তিতে এটি কাজ করছে বলে আমি মনে করি না।

এখানে আমার সেড কমান্ডগুলির একটি উদাহরণ:

sed -e "s/\"text\"/'text'/ig" file.xml > temp.tmp

আপনি কি এইভাবে একটি সেড কমান্ডের উদ্ধৃতি চিহ্নগুলি থেকে বাঁচলেন বা আমি কোনও ভুল করছি?


2
আপনার আদেশ প্রতিস্থাপন জন্য সঠিক দেখায় "text"সঙ্গে 'text'। অবশ্যই এটি কিছুই করবে না "othertext"। কয়েকটি ইনপুট লাইন, সম্পর্কিত অনাকাঙ্ক্ষিত আউটপুট দেখান এবং পরিবর্তে আপনি কী আউটপুট চান তা ব্যাখ্যা করুন।
গিলস 'তাই খারাপ হওয়া বন্ধ করুন'

তাহলে \"সেড কমান্ডে উদ্ধৃতি চিহ্নগুলি পালানোর সঠিক উপায়?
jbranchaud

4
সেডের জন্য নয়: সেডের পালাবার দরকার নেই, বা সমর্থন নেই "। তবে আপনার শেল কমান্ডটি একটি ডাবল-কোটেড স্ট্রিং ব্যবহার করে এবং \"সেখানে সঠিক। sedপ্রোগ্রাম দেখেন s/"text"/'text'/igকরার যুক্তি হিসেবে -e
গিলস'স

@ গিলস স্পেস সম্পর্কে কী? সেড কি সাদা জায়গাগুলি বুঝতে এবং সম্মান করে? উদাহরণস্বরূপ, যদি আমার কমান্ডটি অন্তর্ভুক্ত থাকে তবে s/\"text\" /'text'/igএটির "text" পরে কেবল স্থানটি পাওয়া যাবে?
jbranchaud

3
স্পেসগুলি অবশ্যই মিলবে। এই কথোপকথনটি চালিয়ে যাওয়ার পরিবর্তে, আমি আপনাকে প্রস্তাব দিচ্ছি যে আপনি কিছু নমুনা ইনপুট এবং সংশ্লিষ্ট কাঙ্ক্ষিত আউটপুট পোস্ট করুন (এবং সম্ভবত আপনাকে কেন উদ্ধৃতি পরিবর্তন করতে হবে তা ব্যাখ্যা করুন)। এটি এমনকি পরিষ্কার নয় যে sedকাজের জন্য সঠিক হাতিয়ার, সম্ভবত আপনি কোনও এক্সএমএল পার্সার চান।
গিলস 'খারাপ হয়ে যাওয়া বন্ধ করুন'

উত্তর:


11

দুটি টিপস:

  1. আপনি একক উদ্ধৃতি দিয়ে উদ্ধৃত স্ট্রিংয়ের মধ্যে একটি একক উদ্ধৃতি থেকে বাঁচতে পারবেন না। সুতরাং আপনাকে উদ্ধৃতিটি বন্ধ করতে হবে, একটি পালানো উদ্ধৃতি যোগ করতে হবে, তারপরে আবার উদ্ধৃতিগুলি খুলুন। এটি হ'ল 'foo'\''bar':, যা ভেঙে যায়:

    • 'foo'        উদ্ধৃত foo
    • \'             পলান '
    • 'bar'        উদ্ধৃত bar

    ফলনশীল foo'bar

  2. (alচ্ছিক) আপনার অগত্যা /সেড ব্যবহার করতে হবে না। আমি দেখতে পেলাম যে একই অভ্যাসের ব্যবহার /এবং \এটি পড়া কঠিন করে তোলে।

উদাহরণস্বরূপ, এই ফাইলটি থেকে উদ্ধৃতিগুলি সরাতে:

$ cat /tmp/f
aaa"bbb"'ccc'aaa

উপরে আমার দুটি টিপস দেওয়া, আপনি ডাবল এবং একক উদ্ধৃতি উভয়ই মুছে ফেলার জন্য যে আদেশটি ব্যবহার করতে পারেন তা হ'ল:

$ sed -e 's|["'\'']||g'  /tmp/f

আমার প্রথম টিপের উপর ভিত্তি করে, শেলটি শেডের দ্বিতীয় আর্গুমেন্টকে (যেমন, স্ট্রিংয়ের পরে -e) হ্রাস করে s|["']||gএবং স্ট্রিংটিকে সেডে পাস করে। আমার দ্বিতীয় টিপের উপর ভিত্তি করে, সেড এর সাথে একই আচরণ করে s/['"]//g। এর অর্থ

উভয়ই মেলে এমন সমস্ত অক্ষর মুছে ফেলুন 'বা "   (অর্থাত্, এগুলিকে কিছুই দিয়ে প্রতিস্থাপন করুন)

আপনি যা চান তার জন্য সম্ভবত আপনার আরও জটিল কিছু প্রয়োজন তবে এটি শুরু।


1
আপনার দ্বিতীয় টিপটিতে একটি সূক্ষ্ম বিন্দু রাখার জন্য: s এবং y কমান্ড ব্যবহার করার সময় / এর জায়গায় আপনি যে কোনও অক্ষর সম্ভবত ব্যবহার করতে পারেন। অন্যান্য সেড কমান্ডের সাহায্যে রেগেক্সপস ব্যবহার করার সময়, প্রথম ডিলিমিটারটি (যদি বিকল্পের / / ব্যবহার করে থাকে) এড়াতে হবে। আপনি যদি রেজিপ্যাক্সের মধ্যে এটির সাথে মেলে চেষ্টা করতে চান তবে আপনার পছন্দসই ডিলিমিটারটিও এড়াতে হবে।
এলি হেডি

অগোছালো না হয়ে একক উদ্ধৃতি এবং ডাবল উদ্ধৃতি মিশ্রিত করা শক্ত। কিছু লোক যদি আপনি একক উদ্ধৃতি উদ্ধৃত করেন তবে সেগুলি থেকে বাঁচার পরিবর্তে ডাবল কোটে রেখে তা পড়া সহজ মনে করেন। সুতরাং, বরং 'foo'\''bar', আমরা ব্যবহার করতে পারে 'foo'"'"'bar'
স্কট 21

1

আমার ইউনিক্স ইউটিলিটিগুলির একটি উইন্ডোজ পোর্ট রয়েছে সুতরাং কমান্ডগুলি কিছুটা আলাদা দেখায় তবে আমার কাছে কমা এবং উদ্ধৃতি চিহ্ন সহ একটি সিএসভি ফাইল ছিল। গাইড হিসাবে এই থ্রেডটি ব্যবহার করে, আমি এই আদেশের মাধ্যমে উদ্ধৃতিগুলি সরিয়ে ফেলতে সক্ষম হয়েছি:

c:\Temp> cat report.csv | sed "s/\,/\ /g" | sed "s/[""]//g"

ধন্যবাদ! এই আটকে ছিল!
পাঠায়
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.