আমি কীভাবে ব্যাশে একাধিক পাঠ্য ফাইলের শুরু এবং শেষের পাঠ্যকে সংযুক্ত করব?


24

আমার কাছে পাঠ্য ফাইলের পূর্ণ একটি ডিরেক্টরি রয়েছে। আমার লক্ষ্য হ'ল পাঠকের সমস্তটির শুরু এবং শেষের সাথে সংযুক্ত করা। শুরুতে এবং শেষে যে পাঠ্যটি হয় তা প্রতিটি ফাইলের জন্য একই।

আমি ওয়েব থেকে প্রাপ্ত কোডের ভিত্তিতে এই ফাইলটির শুরুতে যুক্ত করার কোড:

echo -e 'var language = {\n$(cat $BASEDIR/Translations/Javascript/*.txt)' > $BASEDIR/Translations/Javascript/*.txt

এটি ফাইলের শেষের দিকে যুক্ত করার কোড। লক্ষ্যটি };প্রতিটি ফাইলের শেষে পাঠ্য যুক্ত করা হয়:

echo "};" >> $BASEDIR/Translations/Javascript/*.txt

আমি যে উদাহরণগুলি এনেছি তা হ'ল পৃথক ফাইলে অভিনয় করার জন্য। আমি ভেবেছিলাম আমি ওয়াইল্ডকার্ড ব্যবহার করে একাধিক ফাইলে অভিনয় করার চেষ্টা করব *.txt

আমি অন্য ভুলগুলিও করতে পারি। যে কোনও ক্ষেত্রে, আমি একাধিক ফাইলের শুরু এবং শেষের পাঠ্যকে কীভাবে যুক্ত করব?

উত্তর:


27

কোনও ফাইলের পাঠ্য প্রিপেন্ড করতে আপনি (GNU প্রয়োগের সাথে sed) ব্যবহার করতে পারেন :

sed -i '1i some string' file

পাঠ্য যুক্ত করা যেমন সহজ simple

echo 'Some other string' >> file

শেষ কাজটি হ'ল এমন একটি লুপে রাখুন যা আপনি সম্পাদনা করতে চান এমন সমস্ত ফাইলের পুনরাবৃত্তি করে:

for file in *.txt; do
  sed -i '1i Some string' "$file" &&
  echo 'Some other string' >> "$file"
done

8

আপনি জিএনইউ সেড ব্যবহার করতে পারেন

ইতিমধ্যে চিত্রিত মত, আপনি যথাযথভাবে এবং কমান্ড sedব্যবহার করে কোনও ফাইলের লাইন মিলানোর আগে এবং পরে পাঠ্যের লাইন সন্নিবেশ করতে পারেন । যা দেখানো হয়নি তা হ'ল আপনি এটি এক-লাইনারের সাথে এবং একাধিক ফাইলের জন্য একবারে করতে পারেন।ia

নিম্নলিখিতটি প্রথম 1iএবং শেষ লাইনের পরে একটি লাইন প্রবেশ করবে $a। সন্নিবেশগুলি বিশ্বব্যাপী সমস্ত ফাইলের সাথে মিলে কার্যকর করা হবে *.txt

sed -i -e '1ivar language = {' -e '$a};' -- *.txt

উভয়ই iএবং aকেবল লাইন সংখ্যার সাথেই কাজ করে না, তবে প্রতিটি লাইনে একটি নির্দিষ্ট প্যাটার্নের সাথে মেলে। এটিতে একটি মন্তব্য প্রবেশ করানো হবে যখনই কোনও লাইনে থাকবে var y = 2;:

sed -i -- '/var y = 2;/i//initialize variable y' *.js

5

সম্পূর্ণভাবে পসিক্স অনুবর্তী কমান্ড, ব্যবহার করে ex:

for f in *.txt; do printf '%s\n' 0a 'var language = {' . '$a' '};' . x | ex "$f"; done

আপনি যদি printfকমান্ডের অংশটি নিজেই চালান , আপনি দেখতে পাবেন যে সঠিক সম্পাদনা কমান্ড এটি পাস করছে ex:

0a
var language = {
.
$a
};
.
x

0a"" 0 রেখার পরে পাঠ্য সংযুক্ত করুন "(অন্য কথায়, প্রথম লাইনের আগে) means পরের লাইনটি লাইন 0 এর পরে "সংযুক্তি" করার আক্ষরিক পাঠ্য .a

$a অর্থ ফাইলের শেষ লাইনের পরে পাঠ্য সংযুক্ত করা।

x এর অর্থ পরিবর্তনগুলি সংরক্ষণ এবং প্রস্থান করা।


2

পার্লে এটি করার একটি উপায় এখানে রয়েছে:

for f in ./*txt; do
  perl -lpe 'BEGIN{print "First string"}END{print "Last string"}' "$f" > foo && 
  mv foo "$f";
done

@ স্টাফেনচাজেলা -iএই ফাইলের পরিবর্তে যুক্ত করা বিকল্পের কাজ করে না , এটি প্রিন্ট করে স্টডআউট করার জন্য।
ওলেহ প্রিপিন

ওলেহপ্রাইপিন, সত্যই আপনার অধিকার মন্তব্য মুছে ফেলা হয়েছে।
স্টাফেন চেজেলাস

1

ব্যবহার করার চেষ্টা করুন ex:

ex -s +'bufdo!1s/^/HEAD/|$s/$/TAIL/' -cxa *.foo

আদেশগুলি যেখানে:

  • bufdo!প্রতিটি খোলা বাফার / ফাইলের জন্য নীচের আদেশগুলি কার্যকর করে (দ্রষ্টব্য: এটি পসিক্স নয় )
  • 1s/^/HEAD/- HEADলাইনের শুরুতে প্রথম লাইনে পাঠ্য সন্নিবেশ করানো হয়
  • $s/$/TAIL/- TAILলাইনের শেষে শেষ লাইনে পাঠ্য সংযোজন করা হয়

এবং যুক্তিগুলি হ'ল:

  • -s - নীরব / দ্রুত মোড
  • -cxa - সমস্ত খোলা বাফার / ফাইল সংরক্ষণ করুন এবং প্রস্থান করুন
  • *.foo- বর্তমান ডিরেক্টরিতে ( *) fooএক্সটেনশন সহ সমস্ত ফাইল , **/*.fooপুনরাবৃত্তির জন্য ব্যবহার করুন (গ্লোবস্টার সক্ষম করার পরে shopt -s globstar:)


1
@ স্টেভেনপেনি ঠিক আছে আমি স্ক্রিপ্ট সম্পাদনাগুলির জন্য ব্যক্তিগতভাবে শুধুমাত্র পসিক্স নির্দিষ্ট বৈশিষ্ট্য ব্যবহার করি
ওয়াইল্ডকার্ড

1

সহ gnu awk, inplaceএক্সটেনশন এবং BEGINFILE/ ENDFILE:

gawk -i inplace 'BEGINFILE{print "INSERT"};ENDFILE{print "APPEND"};1' ./*.txt

1

হওয়ারও অধিকার রয়েছে ( .outফাইলগুলির ফলাফল সহ ):

find . -name '*.txt' -exec sh -c '(echo HEAD;cat {};echo FOOT) > {}.out' \;

আরেকটি, আরও বিস্তৃত রূপ - উত্স ফাইলগুলি ফলাফলের সাথে প্রতিস্থাপিত হয়েছে:

find . -name '*.txt' -exec sh -c '(echo HEAD;cat {};echo FOOT) > {}.tmp && mv {}.tmp {}' \; -print

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