সেড ব্যবহার করে কোনও ফাইলের সামগ্রীর সাথে স্ট্রিং প্রতিস্থাপন করুন


23

আমার দুটি পৃথক ফাইল রয়েছে:

file1

/home/user1/  
/home/user2/bin  
/home/user1/a/b/c

File2

<TEXT1>
<TEXT2>

আমি ফাইল<TEXT1> 2 এর বিষয়বস্তু ব্যবহার করে ফাইল 2 এর প্রতিস্থাপন করতে চাই । আমি এই আদেশটি চেষ্টা করেছি, কিন্তু সঠিক আউটপুট পাচ্ছি না:sed

cat File2|sed "s/<TEXT1>/$(cat File1|sed 's/\//\\\//g'|sed 's/$/\\n/g'|tr -d "\n")/g"

এই সমস্যাটি সমাধান করতে আপনি অন্যান্য সরঞ্জামগুলিও ব্যবহার করতে পারেন।


দয়া করে সেই ত্রুটি বার্তাটি পেস্ট করুন যাতে আমরা এর উত্সটি সনাক্ত করতে পারি। sedআপনি কোন বাস্তবায়ন ব্যবহার করছেন তা আমাদের জানান । আপনার কোডটি জিএনইউ দিয়ে আমার জন্য কাজ করে sed
manatwork

দুঃখিত, একটি ত্রুটি না পেয়ে। আমি পছন্দসই আউটপুট পাচ্ছি না। আউটপুট মত /home/user1/ n/home/user2/bin n/home/user1/a/b/cn <TEXT2>। নতুন লাইন পাচ্ছে না।
চঞ্চল 1987

এটি আপনার নির্দিষ্ট ক্ষেত্রে প্রযোজ্য কিনা তা নিশ্চিত নয়, তবে diffএবং patchসরঞ্জামগুলি খুব সহজেই অন্য লাইনের দ্বারা কোনও ফাইলে কিছু লাইন প্রতিস্থাপনের অনুমতি দেয়।
স্টাফেন গিমেনেজ

1
বিটিডব্লিউ, $()একটি সেড স্ক্রিপ্টে সংগৃহীত এলোমেলো ডেটা ব্যবহার করে আমার চোখের রক্ত ​​ঝরছে। যেখানে কোনও অক্ষর বিশেষ অর্থ সহ ব্যাখ্যা করা হয় সে জায়গাগুলিতে কখনই বাহ্যিক ডেটা ব্যবহার করবেন না।
স্টাফেন গিমেনেজ

উত্তর:


24

এখানে একটি সেড স্ক্রিপ্ট সমাধান (কমান্ড লাইনের এক লাইনে প্রবেশের চেয়ে চোখের দিকে সহজ):

/<TEXT1>/ {
  r File1
  d
}

এটি চালানো:

$ sed -f script.sed File2
/home/user1/
/home/user2/bin
/home/user1/a/b/c
<TEXT2>

ধন্যবাদ এটি কাজ করছে। তবে আমি অন্য কোনও স্ক্রিপ্ট ফাইল ব্যবহার করতে চাই না। কোন ইনলাইন সমাধান আছে?
চঞ্চল 1987

নিশ্চিত:, sed '/<TEXT1>/{rFile1^Md^M}' File2যেখানে "^ এম" আপনি রিটার্ন টিপছেন। সমস্যাটি হ'ল r এবং d কমান্ডটি সীমাবদ্ধ করতে sed ​​... within এর মধ্যে সত্যিকারের নতুন লাইনের দরকার really
Kusalananda

6
ব্যাশ সহ, পিক্সিক-স্টাইলের স্ট্রিংগুলি কিছুটা ক্লিনার:sed $'/<TEXT1>/ {r File1\n d}'
গ্লেন জ্যাকম্যান

9
এছাড়াও সঙ্গে -e একটি এক মাছ ধরার নৌকা জন্য:sed -e '/<TEXT1>/{r File1' -e 'd}' File2
sdaau

1
এবং যদি পরিবর্তিত সম্পূর্ণ লাইনটি পরিবর্তনের পরিবর্তে <TEXT1>, আমি কেবল স্ট্রিংটি নিজেই প্রতিস্থাপন করতে চাই, বাকী রেখাটি অক্ষত রেখে? Text1: <TEXT1>to Text1: <file_contents>
রবিন উইনস্লো

9

ভের রিপ্লেসমেন্ট ব্যবহার করে এই সমাধানটি খুঁজে পেতে আমাকে দীর্ঘ সময় নিয়েছে। সমস্ত সেড সমাধানগুলি আমার পক্ষে কার্যকর হয়নি, কারণ তারা হয় সম্পূর্ণ লাইনগুলি মুছে দেয় বা ভুলভাবে প্রতিস্থাপন করে।

FILE2=$(<file2)
FILE1=$(<file1)
echo "${FILE2//TEXT1/$FILE1}" 

ফাইল 1 এর সামগ্রীর বিপরীতে ফাইল 2 তে টিএসএটি 1 এর সমস্ত উপস্থিতি প্রতিস্থাপন করে। অন্য সমস্ত পাঠ্য অচ্ছুত রয়েছে।


খুব সুন্দর. সম্ভবত sedখুব দ্রুততর , যেহেতু সেই "বিস্তৃতি" (ওরফে প্রতিস্থাপনগুলি) শেলটিতে নির্মিত হয় ( bashকমপক্ষে)
মৃদু-হলুদ

7

আমি উত্তর দিয়েছি কারণ diff/ patchপদ্ধতিটি কিছু ক্ষেত্রে আগ্রহী হতে পারে। ব্যবহৃত লাইন blob1দ্বারা ফাইলের মধ্যে থাকা লাইনগুলির প্রতিস্থাপনের জন্য blob2:

diff -u blob1 blob2 > patch-file

উদাহরণস্বরূপ, যদি blob1এতে থাকে:

hello
you

এবং blob2এতে রয়েছে:

be
welcome
here

উত্পন্ন patch-fileহবে:

--- blob1   2011-09-08 16:42:24.000000000 +0200
+++ blob2   2011-09-08 16:50:48.000000000 +0200
@@ -1,2 +1,3 @@
-hello
-you
+be
+welcome
+here

এখন, আপনি এই প্যাচটি অন্য কোনও ফাইলে প্রয়োগ করতে পারেন:

patch somefile patch-file

এটা তোলে প্রতিস্থাপন করবে hello, youদ্বারা লাইন be, welcome, hereমধ্যে লাইন somefile


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