নতুন লাইন ছাড়াই প্রতিধ্বনির সাহায্যে পাঠ্য যুক্ত করুন


15

আমি পাঠাতে চাইলে ফাইলটি যুক্ত করতে চাই echo "abc" >>file.txt

তবে এটি abcনতুন লাইনের পরে যুক্ত করুন

abcনতুন লাইন ছাড়া ইকো দিয়ে ফাইলের শেষে আমি কীভাবে যুক্ত করতে পারি ?


2
ফাইলটির ইতিমধ্যে একটি নতুন লাইন রয়েছে, আপনি কেবল এটির পরে যুক্ত করছেন। সুতরাং আপনাকে শেষ পংক্তির নতুন লাইনের অক্ষরটি "abc" দিয়ে প্রতিস্থাপন করতে হবে।
ctrl-alt-delor

স্ট্যাকএক্সচেঞ্জে স্বাগতম! আপনার প্রশ্নটি ভাল; আপনি যদি আপনার ফাইলের বিষয়বস্তুর উদাহরণ উল্লেখ করেন তবে এটি আরও ভাল হত (সংযোজনের আগে, সংযোজনের পরে আপনি কী পাবেন, পরিবর্তে আপনি কী চেয়েছিলেন)। আমি এটি বলছি কারণ একটি উত্তর হ'ল abcচূড়ান্ত নিউলাইন ছাড়া কীভাবে যুক্ত করা যায় , যা (আপনার প্রশ্ন মনোযোগ সহকারে পড়ার পরে) মনে হয় না আপনি কী চান।
Law29

উত্তর:


19

echo "abc" >>file.txtএর পরে একটি নতুন লাইন রাখে abcnot যদি আপনি abcনিজের লাইনে শেষ করে থাকেন , তার মানে এই যে এর আগে নতুন লাইনটি abcইতিমধ্যে উপস্থিত ছিল file.txt

নোট করুন যে কোনও পাঠ্য ফাইলের জন্য একটি নতুন লাইনে শেষ হওয়া একেবারে স্বাভাবিক। ইউনিক্সে, একটি রেখায় নূলে বা নিউলাইন ব্যতীত অন্য একটি অক্ষরের ক্রম থাকে যার পরে একটি নতুন লাইন থাকে। 1 অতএব যে কোনও খালি খালি পাঠ্য ফাইলটি একটি নতুন লাইনের চরিত্রের সাথে শেষ হয়।

আপনি যদি কোনও ফাইলের শেষ লাইনে পাঠ্য যুক্ত করতে চান তবে আপনি >>এটিটি দিয়ে করতে পারবেন না কারণ এটি সর্বদা ফাইলের সাথে সংযুক্ত থাকে, তাই এটি সর্বদা সর্বশেষ নতুন লাইনের পরে লেখায়। পরিবর্তে আপনার একটি সরঞ্জাম প্রয়োজন যা বিদ্যমান ফাইলটি সংশোধন করতে সক্ষম। উদাহরণস্বরূপ, আপনি সেড ব্যবহার করতে পারেন :

sed '$ s/$/abc/' file.txt >file.txt.new && mv file.txt.new file.txt

সেড কমান্ডে, প্রথমটির $অর্থ "কেবলমাত্র শেষ লাইনে নিম্নলিখিত কমান্ডটি করুন", কমান্ডটি s/REGEX/REPLACEMENT/রেগেক্সের পরিবর্তে রেগেক্সকে প্রতিস্থাপন করে এবং $লাইনটির শেষে নিয়মিত এক্সপ্রেশন মেলে।

লিনাক্সের সেড কমান্ডটিতে এই তৈরি-নতুন-ফাইল-এবং-প্রতিস্থাপনের ক্রমটি স্বয়ংক্রিয় করতে একটি বিল্ট-ইন বৈশিষ্ট্য রয়েছে, যাতে আপনি এটি সংক্ষিপ্ত করতে পারেন

sed -i '$ s/$/abc/' file.txt

এটি একটি নাল বাইট, যা ASCII NUL এবং ইউনিকোডকে ইউ + 0000 কল করে। পাঠ্য প্রক্রিয়াজাতকরণ প্রোগ্রামগুলি এই চরিত্রটি মোকাবেলা করতে পারে বা নাও পারে।
1 সংজ্ঞা দেখুন টেক্সট ফাইল , লাইন , এবং NEWLINE ক্যারেক্টার এর "সংজ্ঞা" বিভাগে বেজ সংজ্ঞা আইইইই 1003.1-2008 অধ্যায়: 2016।


2
আপনার দ্বিতীয় অনুচ্ছেদে বোঝানো কি এমন ফাইল যা একটি নতুন লাইনের সাথে শেষ হয় না এটি কোনও পাঠ্য ফাইল নয়? উদাহরণস্বরূপ, যদি আমি একটি বিদ্যমান এএসসিআইআই টেক্সট ফাইল গ্রহণ করি যা একটি নতুন লাইনের সাথে শেষ হয় এবং একটি একক বাইট 0x41(এএসসিআইআই 'A') যুক্ত হয়, তবে এটি প্রযুক্তিগতভাবে কোনও পাঠ্য ফাইল নয়? যদি তা হয় তবে আমি সেই বিন্দুটির উপরে জোর দেওয়ার পরামর্শ দিচ্ছি কারণ এটি একপ্রকার সংজ্ঞাতীত সংজ্ঞা; যদি তা না হয় তবে কথার সামান্য পরিবর্তন বিভ্রান্তি এড়াতে সহায়তা করতে পারে।
ডেভিড জেড

2
@ ডেভিডজেড: এটি ইউনিক্সল্যান্ডের একটি পাঠ্য ফাইলের স্ট্যান্ডার্ড সংজ্ঞা। আইআইআরসি এটি কোথাও পসিক্সেও রয়েছে।
কেভিন

1
@ কেভিন আকর্ষণীয়, আমি এর আগে কখনও শুনিনি। ভাল, এমনকি এটি মানসম্মত হলেও, আমি মনে করি এটি একরকম অপ্রচলিত।
ডেভিড জেড

15

echoকমান্ড দিয়ে এটি সম্ভব বলে আমি মনে করি না , sedপরিবর্তে নিম্নলিখিত পদ্ধতিটি ব্যবহার করুন:

sed -i '$ s/$/abc/' file.txt
  • -i- ফাইল পরিবর্তন inplace
  • $ - সর্বশেষ রেকর্ড / লাইনটি নির্দেশ করুন
  • s/$/abc/- $স্ট্রিংয়ের সাথে লাইনের abcশেষটি প্রতিস্থাপন করুন (শেষ রেকর্ডের জন্য)

2
নোট করুন যে "জায়গায়" সত্যিকার অর্থে স্থান নয়। এর অর্থ "বিদ্যমান ফাইলের পাশাপাশি একটি অস্থায়ী নামের ফাইলটিতে সম্পাদিত সামগ্রীটি লিখুন এবং তারপরে এটি প্রতিস্থাপন করুন"। আপনি date >file; ls -i file; sed -i 's/201/ZZZ/' file; ls -i file
রোডেমা

@ রাইমা, আমি ইনোড নম্বর পরিবর্তনের বিষয়ে সচেতন।
রোমানপ্রেখারেস্ট

2
আমি ভেবেছিলাম আপনি থাকতে পারতেন, কিন্তু আমি উদ্বিগ্ন ছিলাম যে আপনার জোর দিয়ে ওপি নাইটটি মনে করে এটি ডাবল ডিস্ক জায়গার ব্যবহার এড়াতে ব্যবহার করা যেতে পারে, যেমন একটি বড় ফাইল সহ large
রোয়াইমা

@ রোয়াইমা, রাতের কথা -> ভাবতে পারে ...
রোমানপেরেখারেস্ট

আমি যদি একটি ভেরিয়েবলের সাথে এবিসি প্রতিস্থাপন করতে চাই তবে কী হবে? '$ s/$/$1/'প্রিন্টগুলি ব্যবহার করে$1
ফ্লোরিয়ান কাস্টেলাইন

14

ধরে নিলাম যে ফাইলটি একটি নতুন লাইনে ইতিমধ্যে শেষ হচ্ছে না এবং আপনি কেবল একটি যোগ না করেই আরও কিছু পাঠ্য যুক্ত করতে চান, আপনি -nযুক্তিটি ব্যবহার করতে পারেন , উদাহরণস্বরূপ

echo -n "some text here" >> file.txt

তবে কিছু ইউনিক্স সিস্টেম এই বিকল্পটি সরবরাহ করে না; যদি এমনটি হয় তবে আপনি printfযেমন ব্যবহার করতে পারেন

printf %s "some text here" >> file.txt

(প্রাথমিক %sযুক্তি অতিরিক্ত %বিন্যাসে এতে ফরম্যাটিং অক্ষর থাকার বিরুদ্ধে রক্ষা করা হচ্ছে )

থেকে man echo(MacOS উচ্চ সিয়েরা দিকে):

-n

চলমান নিউলাইন চরিত্রটি মুদ্রণ করবেন না। '\c'আইবিসিএস 2 সামঞ্জস্যপূর্ণ সিস্টেমগুলির মতো স্ট্রিংয়ের শেষে যুক্ত হয়ে এটিও অর্জন করা যেতে পারে । নোট করুন যে এই বিকল্পটির পাশাপাশি এর প্রভাবটি '\c'আইইইই স্ট্যান্ডার্ড 1003.1-2001 ("POSIX.1") তে সংশোধিত হিসাবে বাস্তবায়ন-সংজ্ঞায়িত হয়েছে। 1-2002। সর্বাধিক বহনযোগ্যতার জন্য লক্ষ্যযুক্ত অ্যাপ্লিকেশনগুলিকে printf(1)নতুন লাইন চরিত্রটি দমন করতে দৃ strongly়ভাবে উত্সাহ দেওয়া হচ্ছে ।


এটা বেশ স্পষ্টত নেই একটি newline দিয়ে শেষ। echo -nশেষে কোনও নিউলাইন রাখেনি abc, তবে abcএরপরে একটি নতুন লাইন থাকবে, যা ব্যবহারকারী এড়াতে চান।
কুসালানন্দ

@ কুসালানন্দ আমার উত্তরটি এই ধারণাটি ব্যবহার করে আরও অনুধাবন করছিল যে ওপি তাদের প্রক্রিয়াটি এমনভাবে বদলে দেওয়ার চেষ্টা করবে যাতে বুদ্ধিমানরা \nপ্রথম স্থানে দেখা যায় না। আরও বিকল্পগুলি আরও ভাল, বিশেষত যখন তারা প্রতিবারই কোনও পরিবর্তন ঘটে তখন পুরো ফাইলটি পুনরায় লেখার সাথে জড়িত না (যা বারবার করা হয়ে গেলে ধীরে ধীরে ধীরে ধীরে চলতে পারে এবং বহুবারের সময় চলতে পারে)।
ফ্লফি

9

আপনার কাছে যদি truncateকমান্ড থাকে এবং আপনার পাঠ্য ফাইলটির শেষ অক্ষর হিসাবে এনএল থাকে আপনি এটি মুছে ফেলতে পারেন এবং তারপরে আপনার পাঠ্যটি এভাবে যুক্ত করতে পারেন:

truncate --size -1 file.txt
echo "abc" >>file.txt

(নোট করুন truncateফাইলের বিষয়বস্তু সম্পর্কে কোনও চিন্তা নেই এবং এই উদাহরণে কেবলমাত্র ফাইলের আকারটি একটি বাইট দ্বারা হ্রাস করে।


5

আপনি যা চান তা হ'ল এটি শেষ লাইনের শেষে যুক্ত করা উচিত, সুতরাং শেষ পংক্তির ডিলিমিটারের ঠিক আগে, ফাইলের শেষ চরিত্রের ঠিক আগে।

সহ ksh93, আপনি এটি করতে পারেন:

echo abc 1<> file >#((EOF - 1))

কোথায় 1<>(এবং আরো গুরুত্বপূর্ণ পঠিত + + লেখার মোডে একটি ফাইল খোলার জন্য মান অপারেটর ছাঁটাই ছাড়া stdout- এ) এবং >#((...))একটি ksh93-নির্দিষ্ট চাইছেন অপারেটর (এখানে গত বাইট আগে করার চেষ্টা করার জন্য)। দ্রষ্টব্য যে সেখানে echoলিখেছে abc<newline>সেখানে aযে নতুন লাইনটি ওভাররাইট করে সেখানে echoতার নিজস্ব নতুন লাইন যুক্ত করে।

zshসমতুল্য:

zmodload zsh/system
{sysseek -w end -u 1 -1 && echo abc} 1<> file

যদিও আরও সঠিক সমতুল্যের জন্য, আপনাকেও ব্যর্থ হওয়ার পরে ত্রুটি বার্তা মুদ্রণ করতে হবে:

zmodload zsh/system
if sysseek -w end -u 1 -1; then
  echo abc
else
  syserror -p "$0: $LINENO: seek: "
fi 1<> file

-1

সম্ভবত একটি ইউইউসি কিন্তু আপনি এটি করতে পারেন:

echo "$(cat file.txt)abc" >file.txt

গিলস যেমন নির্দেশ করেছেন এই আদেশটি সীমাবদ্ধ:

এটি বেশিরভাগ ক্ষেত্রেই কাজ করে, তবে কখনও কখনও ফাইলের শেষে একটি ফাঁকা লাইন এবং অবিলম্বে একটি ফাঁকা রেখা থাকলে তা হয় না। যেমন একটি নির্দিষ্ট সংখ্যক লাইনের একটি ফাইল, যেখানে শেষ লাইনটি প্রাথমিকভাবে ফাঁকা থাকে এবং সময়ের সাথে সাথে প্রসারিত হয় এবং পরবর্তী-থেকে-শেষ-লাইনটি কখনও কখনও খালিও হতে পারে।

catআপনি যে ফাইলগুলির সাথে পরিচিত না সেগুলি ব্যবহারের বিষয়ে সতর্ক থাকুন :

উপসংহার :

সেড ব্যবহার করুন


2
এটি বেশিরভাগ ক্ষেত্রেই কাজ করে, তবে কখনও কখনও ফাইলের শেষে একটি ফাঁকা লাইন এবং অবিলম্বে একটি ফাঁকা রেখা থাকলে তা হয় না। যেমন একটি নির্দিষ্ট সংখ্যক লাইনের একটি ফাইল, যেখানে শেষ লাইনটি প্রাথমিকভাবে ফাঁকা থাকে এবং সময়ের সাথে সাথে প্রসারিত হয় এবং পরবর্তী-থেকে-শেষ-লাইনটি কখনও কখনও খালিও হতে পারে।
গিলস'স'-এ খারাপ হওয়া বন্ধ করুন '

আমি এটি মুছে ফেলা উচিত? আমি স্পষ্টতই মনে করি রোমান / আপনার উত্তরটি সঠিক পথে যাওয়ার উপায় তবে আমি জানি ব্যক্তিগতভাবে আমি বিকল্পগুলি দেখতে পছন্দ করি এবং ওপি চেয়েছিল echo: p
jesse_b

1
এছাড়াও এটি সম্পূর্ণ ফাইলটি কমান্ড লাইনে রাখে
n.caillou

@ n.caillou হাহ? এটি STDOUT এ কোনও মুদ্রণ করবে না।
jesse_b

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