সংস্করণ নিয়ন্ত্রণ ব্যবস্থা ব্যবহার করে আমি যখন ডফফ বলি তখন আমি শব্দে বিরক্ত হই No newline at end of file
।
তাই আমি ভাবছিলাম: এই বার্তাগুলি থেকে মুক্তি পেতে কোনও ফাইলের শেষে কীভাবে একটি নিউলাইন যুক্ত করবেন?
সংস্করণ নিয়ন্ত্রণ ব্যবস্থা ব্যবহার করে আমি যখন ডফফ বলি তখন আমি শব্দে বিরক্ত হই No newline at end of file
।
তাই আমি ভাবছিলাম: এই বার্তাগুলি থেকে মুক্তি পেতে কোনও ফাইলের শেষে কীভাবে একটি নিউলাইন যুক্ত করবেন?
উত্তর:
কোনও প্রকল্প পুনরাবৃত্তভাবে স্যানিটাইজ করার জন্য আমি এই অনলাইনারটি ব্যবহার করি:
git ls-files -z | while IFS= read -rd '' f; do tail -c1 < "$f" | read -r _ || echo >> "$f"; done
ব্যাখ্যা:
git ls-files -z
সংগ্রহস্থলে ফাইল তালিকাভুক্ত করে। অতিরিক্ত প্যারামিটার হিসাবে এটি একটি .চ্ছিক প্যাটার্ন নেয় যা আপনি যদি কিছু ফাইল / ডিরেক্টরিতে অপারেশন সীমাবদ্ধ রাখতে চান তবে কিছু ক্ষেত্রে কার্যকর হতে পারে। বিকল্প হিসাবে, আপনি find -print0 ...
প্রভাবিত ফাইলগুলির তালিকা করতে বা অনুরূপ প্রোগ্রামগুলি ব্যবহার করতে পারেন - এটি নিশ্চিত করুন - এটি NUL
স্বীকৃত এন্ট্রিগুলি নির্গত করে ।
while IFS= read -rd '' f; do ... done
এন্ট্রিগুলির মাধ্যমে পুনরাবৃত্তি করে, নিরাপদে হোয়াইটস্পেস এবং / অথবা নিউলাইন অন্তর্ভুক্ত ফাইলের নামগুলি পরিচালনা করে।
tail -c1 < "$f"
একটি ফাইল থেকে শেষ চর পড়ে।
read -r _
যদি একটি নতুন ট্রেইলিং অনুপস্থিত থাকে তবে ননজারো প্রস্থান স্থিতির সাথে প্রস্থান করে।
|| echo >> "$f"
পূর্ববর্তী কমান্ডের প্রস্থান স্থিতি যদি নাজারো হয় তবে ফাইলটিতে একটি নতুন লাইন যুক্ত হয়।
find -name \*.java | while read f; do tail -n1 $f | read -r _ || echo >> $f; done
git ls-files
যা এখনও সংস্করণ নিয়ন্ত্রণে ট্র্যাক করা হয়নি এমন ফাইলগুলি সম্পাদনা করা থেকে রক্ষা করবে।
IFS=
আনসেট করতে যোগ করা আশেপাশের শ্বেতস্থান সংরক্ষণ করা ভাল। নাল টার্মিনেটেড এন্ট্রিগুলি কেবলমাত্র তখনই প্রাসঙ্গিক যে আপনার নামে একটি নতুন লাইন যুক্ত ফাইল বা ডিরেক্টরি রয়েছে, যা এক ধরণের প্রকারের মনে হয় তবে জেনেরিক কেস পরিচালনা করার আরও সঠিক উপায়, আমি সম্মত। শুধু একটি ছোট সতর্কীকরণ হিসাবে: -d
বিকল্পে read
POSIX SH উপলব্ধ নেই।
tail -n1 < "$f"
ফাইল নামের সাথে সমস্যাগুলি এড়ানোর জন্য আমার ব্যবহারটি দেখুন যা দিয়ে শুরু হয় -
(কল করা tail -n1 -- "$f"
ফাইলটির জন্য কাজ করে না -
)। আপনি পরিষ্কার করতে চাইতে পারেন যে উত্তরটি এখন zsh / বাশ নির্দিষ্ট।
sed -i -e '$a\' file
এবং বিকল্পভাবে ওএস এক্স এর জন্য sed
:
sed -i '' -e '$a\' file
এটি কেবল\n
ফাইলের শেষে যুক্ত হয় যদি এটি ইতিমধ্যে কোনও নতুন লাইন দিয়ে শেষ না হয়। সুতরাং আপনি যদি এটি দুটিবার চালনা করেন তবে এটি আর একটি নতুন লাইন যুক্ত করবে না:
$ cd "$(mktemp -d)"
$ printf foo > test.txt
$ sed -e '$a\' test.txt > test-with-eol.txt
$ diff test*
1c1
< foo
\ No newline at end of file
---
> foo
$ echo $?
1
$ sed -e '$a\' test-with-eol.txt > test-still-with-one-eol.txt
$ diff test-with-eol.txt test-still-with-one-eol.txt
$ echo $?
0
man sed
: $ Match the last line.
তবে সম্ভবত এটি কেবল দুর্ঘটনাক্রমে কাজ করে। আপনার সমাধানটিও কাজ করে।
$
শেষ লাইনের সাথে মিলে যায় তবে কেন এটি ইতিমধ্যে একটি নিউলাইন রয়েছে এমন স্ট্রিংয়ে অন্য একটি নতুন লাইন যুক্ত হবে না?
$
। একটি রেইজেক্সের অভ্যন্তরে যেমন ফর্মের সাথে /<regex>/
এটির সাথে "লাইনের শেষ ম্যাচ" অর্থ রয়েছে। অন্যথায়, ঠিকানা হিসাবে ব্যবহৃত, সেড এটি বিশেষ "ফাইলের শেষ লাইন" অর্থ দেয়। কোডটি কাজ করে কারণ সেডটি ডিফল্টরূপে এর আউটপুটটিতে একটি নতুন লাইন যুক্ত করে যদি এটি ইতিমধ্যে না থাকে। "$ A \" কোডটি কেবল বলেছে "ফাইলের শেষ লাইনের সাথে মেলে এবং এতে কিছুই জুড়বে না।" তবে স্পষ্টতই, সেড প্রতিটি লাইনে প্রসেস করে নতুন লাইন যুক্ত করে (যেমন এই $
লাইন) যদি এটি ইতিমধ্যে না থাকে তবে।
/regex/
এটি একটি আলাদা অর্থ দেয়। ফ্রিবিএসডি ম্যানাপেজগুলি
একবার দেখুন:
$ echo -n foo > foo
$ cat foo
foo$
$ echo "" >> foo
$ cat foo
foo
সুতরাং echo "" >> noeol-file
কৌশলটি করা উচিত। (বা আপনার অর্থ এই ফাইলগুলি সনাক্তকরণ এবং সেগুলি ঠিক করার জন্য জিজ্ঞাসা করার অর্থ ছিল ?)
সম্পাদনা এতে ""
থেকে সরানো হয়েছে echo "" >> foo
(@ ইয়ুইচাওর মন্তব্য দেখুন) edit2""
আবার যুক্ত করেছে ( তবে @
কিথ থম্পসনের মন্তব্য দেখুন)
""
প্রয়োজনীয় (অন্তত ব্যাশ জন্য) নয় এবং tail -1 | wc -l
শেষে একটি নতুন লাইন ছাড়া ফাইল খুঁজে বের করতে ব্যবহার করা যেতে পারে
""
জন্য এটি প্রয়োজনীয় নয়, তবে আমি এমন echo
বাস্তবায়ন দেখেছি যেগুলি যুক্তি ছাড়াই আহ্বান করা হলে কিছুই মুদ্রিত হয় না (যদিও এখন যেগুলির মধ্যে আমি খুঁজে পেতে পারি তার কোনওটিই এটি করে না)। echo "" >> noeol-file
সম্ভবত কিছুটা বেশি শক্তিশালী। printf "\n" >> noeol-file
আরও বেশি তাই।
csh
এর echo
আউটপুট কিছুই পরিচিত যখন কোনো আর্গুমেন্ট পাস না হয়। কিন্তু তারপর যদি আমরা অ বোর্ন মত শাঁস সমর্থন করার জন্য চলুন, আমরা এটা করা উচিত echo ''
পরিবর্তে echo ""
যেমন echo ""
ouput হবে ""<newline>
সঙ্গে rc
বা es
উদাহরণস্বরূপ।
tcsh
বিপরীতে csh
, কোনও বিন্যাস ছাড়াই অনুরোধ করা হলে একটি নিউলাইন প্রিন্ট করে - সেটিং নির্বিশেষে $echo_style
।
আর একটি সমাধান ব্যবহার করে ed
। এই সমাধানটি কেবলমাত্র সর্বশেষ লাইনে প্রভাব ফেলবে এবং কেবল \n
অনুপস্থিত থাকলে:
ed -s file <<< w
এটি মূলত কোনও স্ক্রিপ্টের মাধ্যমে সম্পাদনা করার জন্য ফাইলটি খোলার কাজ করে, স্ক্রিপ্টটি একক w
কমান্ড, যা ফাইলটি ডিস্কে ফিরে লেখেন। এটি ed(1)
ম্যান পেজে পাওয়া এই বাক্যটির ভিত্তিতে :
সীমাবদ্ধতা (...) যদি কোনও পাঠ্য (নন-বাইনারি) ফাইলটি একটি নতুন লাইন অক্ষর দ্বারা শেষ না করা হয়, তারপরে এড পড়ার / লেখার ক্ষেত্রে এটিকে যুক্ত করে। বাইনারি ক্ষেত্রে ফাইল, এড পড়া / লেখার ক্ষেত্রে একটি নতুন লাইন যুক্ত করে না।
কোনও অনুপস্থিত, চূড়ান্ত নিউলাইনটি একটিতে যুক্ত করার জন্য একটি সহজ, পোর্টেবল, পসিএক্স-সম্মতিযুক্ত উপায় হ'ল পাঠ্য ফাইল হবে:
[ -n "$(tail -c1 file)" ] && echo >> file
এই পদ্ধতির পুরো ফাইলটি পড়ার দরকার নেই; এটি কেবল ইওএফের সন্ধান করতে এবং সেখান থেকে কাজ করতে পারে।
এই পদ্ধতির জন্য আপনার পিছনের পিছনে টেম্প ফাইলগুলি তৈরি করার দরকার নেই (যেমন সেড-আই), তাই হার্ডলিঙ্কগুলি প্রভাবিত হয় না।
প্রতিধ্বনি তখনই ফাইলটিতে একটি নতুন লাইন যুক্ত করে যখন কমান্ড প্রতিস্থাপনার ফলাফলটি একটি শূন্যস্থান না থাকে। দ্রষ্টব্য যে কেবলমাত্র যদি ফাইলটি খালি না থাকে এবং শেষ বাইটটি কোনও নতুন লাইন না হয় তবেই এটি ঘটতে পারে।
যদি ফাইলের শেষ বাইটটি একটি নতুন লাইন হয় তবে লেজ এটি ফিরিয়ে দেয়, তারপরে কমান্ড প্রতিস্থাপন এটি স্ট্রিপ করে; ফলাফলটি একটি খালি স্ট্রিং। -N পরীক্ষা ব্যর্থ হয় এবং প্রতিধ্বনি চলে না।
যদি ফাইলটি খালি থাকে, কমান্ড প্রতিস্থাপনের ফলাফলটিও একটি খালি স্ট্রিং, এবং আবার প্রতিধ্বনি চলবে না। এটি আকাঙ্খিত, কারণ একটি খালি ফাইলটি কোনও অবৈধ পাঠ্য ফাইল নয়, এটি খালি লাইন সহ একটি খালি খালি পাঠ্য ফাইলের সমান নয়।
yash
ফাইলের শেষ অক্ষরটি একটি বহু-বাইট অক্ষর (উদাহরণস্বরূপ ইউটিএফ -8 স্থানীয় অবস্থানে), বা যদি লোকেল সি এবং ফাইলের শেষ বাইটে 8 তম বিট সেট থাকে তবে এটি কাজ করে না। অন্যান্য শেলগুলির সাথে (zsh ব্যতীত) ফাইলটি কোনও NUL বাইটে শেষ হয়ে গেলে এটি কোনও নতুন লাইন যুক্ত করবে না (তবে তারপরে আবার, এর অর্থ হ'ল নতুন লাইন যুক্ত হওয়ার পরেও ইনপুটটি অ-পাঠ্য হবে)।
নির্বিশেষে নতুন লাইন যুক্ত করুন:
echo >> filename
পাইথন ব্যবহার করে একটি যুক্ত করার আগে একটি নতুন লাইন শেষে উপস্থিত রয়েছে কিনা তা যাচাই করার জন্য এখানে একটি উপায়:
f=filename; python -c "import sys; sys.exit(open(\"$f\").read().endswith('\n'))" && echo >> $f
echo ""
তুলনায় আরো শক্তিশালী বলে মনে হচ্ছে echo -n '\n'
। বা আপনি ব্যবহার করতে পারেনprintf '\n'
দ্রুত সমাধানটি হ'ল:
[ -n "$(tail -c1 file)" ] && printf '\n' >>file
সত্যিই দ্রুত।
মাঝারি আকারের ফাইলে seq 99999999 >file
এটি মিলিসেকেন্ড নেয়।
অন্যান্য সমাধানগুলি দীর্ঘ সময় নেয়:
[ -n "$(tail -c1 file)" ] && printf '\n' >>file 0.013 sec
vi -ecwq file 2.544 sec
paste file 1<> file 31.943 sec
ed -s file <<< w 1m 4.422 sec
sed -i -e '$a\' file 3m 20.931 sec
ছাই, বাশ, লক্ষ, মক্ষ, ksh93, আতশ এবং জেডে কাজ করে তবে যশ নয়।
আপনার যদি যশ (এবং উপরে তালিকাভুক্ত অন্যান্য সমস্ত শেল) পোর্টেবল সমাধানের প্রয়োজন হয় তবে এটি কিছুটা জটিল হতে পারে:
f=file
if [ "$(tail -c1 "$f"; echo x)" != "$(printf '\nx')" ]
then printf '\n' >>"$f"
fi
কোনও ফাইলের শেষ বাইটটি যদি নতুন লাইন হয় তা পরীক্ষা করার দ্রুততম উপায়টি কেবলমাত্র সেই শেষ বাইটটিই পড়তে হয়। এটি দিয়ে করা যেতে পারে tail -c1 file
। যাইহোক, বাইট মানটি একটি নতুন লাইন কিনা তা পরীক্ষা করার সরল পদ্ধতিতে কমান্ড প্রসারণের অভ্যন্তরে অনুমান করা নতুন লাইনের শেলের উপর নির্ভর করে যশতে ব্যর্থ হয় (উদাহরণস্বরূপ), যখন ফাইলের শেষ অক্ষরটি ইউটিএফ- হয় 8 মান।
কোনও ফাইলের শেষ বাইটটি নতুন লাইন কিনা xxd বা hexdump ব্যবহারের জন্য সঠিক, পসিক্স-সম্মতিযুক্ত, সমস্ত (যুক্তিসঙ্গত) শাঁস উপায়:
tail -c1 file | xxd -u -p
tail -c1 file | hexdump -v -e '/1 "%02X"'
তারপরে, উপরের আউটপুটটির সাথে তুলনা করা 0A
একটি শক্ত পরীক্ষা দেবে।
অন্যথায় খালি ফাইলটিতে একটি নতুন লাইন যুক্ত করা এড়াতে দরকারী is
ফাইল যা অবশ্যই একটি শেষ চরিত্র সরবরাহ করতে ব্যর্থ হবে 0A
:
f=file
a=$(tail -c1 "$f" | hexdump -v -e '/1 "%02X"')
[ -s "$f" -a "$a" != "0A" ] && echo >> "$f"
স্বল্প ও মধুর. এটি কেবলমাত্র সর্বশেষ বাইটটি পড়ার কারণে খুব কম সময় নেয় (ইওফের দিকে তাকান)। ফাইলটি বড় হলে কিছু যায় আসে না। তারপরে প্রয়োজনে কেবল একটি বাইট যুক্ত করুন।
কোনও টেম্প ফাইলের প্রয়োজন নেই বা ব্যবহৃত হয়নি। কোনও হার্ডলিঙ্ক ক্ষতিগ্রস্থ হয় না।
যদি এই পরীক্ষাটি দু'বার চালানো হয় তবে এটি আর একটি নতুন লাইন যুক্ত করবে না ।
xxd
না hexdump
POSIX ইউটিলিটি আছে। পসিক্স টুলকেষ্টে od -An -tx1
বাইটের হেক্স মান পাওয়া যায়।
আপনি সর্বশেষে ফাইলটি সম্পাদনা করেছেন এমন সম্পাদকের সংশোধন করা ভাল better আপনি যদি ফাইলটি সম্পাদনা করার শেষ ব্যক্তি হন - আপনি কোন সম্পাদকটি ব্যবহার করছেন, আমি অনুমান করছি পাঠ্যসেবক ..?
emacs
ফাইলের শেষে আমার কোনও নতুন লাইন যুক্ত হবে না।
(setq require-final-newline 'ask)
আমার.emacs
কিছু পাইপলাইন প্রক্রিয়া করার সময় আপনি যদি কেবল নতুন লাইন যুক্ত করতে চান তবে এটি ব্যবহার করুন:
outputting_program | { cat ; echo ; }
এটি পসিক্স অনুগতও।
তারপরে অবশ্যই আপনি এটি কোনও ফাইলে পুনর্নির্দেশ করতে পারেন।
cat file.csv | tr "\r" "\n" | { cat; echo; } | sed "/^[[:space:]]*$/d" | tail -n +2 | wc -l
প্রদত্ত ইনপুটটিতে কোনও নাল নেই:
paste - <>infile >&0
... একটি পীড়নের লেজ প্রান্তে যদি ইতিমধ্যে এটি না থাকে তবে কেবল সর্বদা একটি নতুন লাইন যুক্ত করা যথেষ্ট। এবং এটি সঠিক হওয়ার জন্য কেবল একবার ইনপুট ফাইলটি পড়তে হবে।
paste infile 1<> infile
পরিবর্তে আপনার প্রয়োজন হবে।
যদিও এটি সরাসরি প্রশ্নের উত্তর দেয় না, এখানে ফাইলগুলি সনাক্ত করতে আমি লিখিত একটি সম্পর্কিত স্ক্রিপ্ট যা নিউলাইনে শেষ হয় না। এটা খুব দ্রুত।
find . -type f | # sort | # sort file names if you like
/usr/bin/perl -lne '
open FH, "<", $_ or do { print " error: $_"; next };
$pos = sysseek FH, 0, 2; # seek to EOF
if (!defined $pos) { print " error: $_"; next }
if ($pos == 0) { print " empty: $_"; next }
$pos = sysseek FH, -1, 1; # seek to last char
if (!defined $pos) { print " error: $_"; next }
$cnt = sysread FH, $c, 1;
if (!$cnt) { print " error: $_"; next }
if ($c eq "\n") { print " EOL: $_"; next }
else { print "no EOL: $_"; next }
'
পার্ল স্ক্রিপ্ট স্টিডিন থেকে ফাইলের নামের (allyচ্ছিকভাবে বাছাই করা) একটি তালিকা পড়ে এবং প্রতিটি ফাইলের জন্য এটি ফাইলটি একটি নতুন লাইনে শেষ হয় কিনা তা নির্ধারণ করার জন্য শেষ বাইটটি পড়ে। এটি খুব দ্রুত কারণ এটি প্রতিটি ফাইলের সম্পূর্ণ বিষয়বস্তু পড়া এড়ানো যায়। এটি প্রতিটি ফাইল এটি পড়ার জন্য একটি লাইন আউটপুট দেয়, "ত্রুটি:" দিয়ে উপসর্গ করা হয় যদি কোনও ধরণের ত্রুটি দেখা দেয় তবে "খালি:" ফাইলটি ফাঁকা থাকলে (নতুন লাইনের সাথে শেষ হয় না!), "EOL:" ("এর শেষে) লাইন ") ফাইলটি যদি নতুন লাইনের সাথে শেষ হয় এবং" নতুন কোনও EOL: "ফাইলটি যদি নতুন লাইনের সাথে শেষ না হয়।
দ্রষ্টব্য: স্ক্রিপ্টটি ফাইলের নামগুলি হ্যান্ডেল করে না যাতে নিউলাইন রয়েছে। আপনি যদি কোনও জিএনইউ বা বিএসডি সিস্টেমে থাকেন তবে আপনি সম্ভাব্য সমস্ত ফাইলের নামগুলি সন্ধানের জন্য--প্রিন্ট 0, -z সাজাতে, এবং -0 পার্লে যুক্ত করে এটি পরিচালনা করতে পারেন:
find . -type f -print0 | sort -z |
/usr/bin/perl -ln0e '
open FH, "<", $_ or do { print " error: $_"; next };
$pos = sysseek FH, 0, 2; # seek to EOF
if (!defined $pos) { print " error: $_"; next }
if ($pos == 0) { print " empty: $_"; next }
$pos = sysseek FH, -1, 1; # seek to last char
if (!defined $pos) { print " error: $_"; next }
$cnt = sysread FH, $c, 1;
if (!$cnt) { print " error: $_"; next }
if ($c eq "\n") { print " EOL: $_"; next }
else { print "no EOL: $_"; next }
'
অবশ্যই, আপনাকে এখনও আউটপুটটিতে নিউলাইনগুলি (পাঠকের অনুশীলন হিসাবে ছেড়ে দেওয়া) সহ ফাইলের নামগুলি এনকোড করার একটি উপায় নিয়ে আসতে হবে।
আউটপুট ফিল্টার করা যেতে পারে, যদি ইচ্ছা হয় তবে সেই ফাইলগুলিতে একটি নতুন লাইন যুক্ত করা যায়, যার মধ্যে খুব সহজেই থাকে
echo >> "$filename"
চূড়ান্ত নিউলাইনটির অভাব স্ক্রিপ্টগুলিতে বাগের কারণ হতে পারে যেহেতু শেল এবং অন্যান্য ইউটিলিটিগুলির কিছু সংস্করণ সঠিকভাবে কোনও ফাইলটি পড়ার সময় অনুপস্থিত চূড়ান্ত নিউলাইন পরিচালনা করতে পারে না।
আমার অভিজ্ঞতায়, ফাইলগুলি সম্পাদনা করার জন্য বিভিন্ন উইন্ডোজ ইউটিলিটি ব্যবহার করে একটি চূড়ান্ত নতুন লাইনের অভাব দেখা দেয়। কোনও ফাইল সম্পাদনা করার সময় আমি কখনই ভিএমকে হারিয়ে যাওয়া চূড়ান্ত নিউলাইনটি দেখিনি, যদিও এটি এই জাতীয় ফাইলে রিপোর্ট করবে।
অবশেষে, অনেকগুলি ছোট (তবে ধীর) স্ক্রিপ্ট রয়েছে যা তাদের ফাইলের নাম ইনপুটগুলি লুপ করতে পারে সেই ফাইলগুলি মুদ্রণের জন্য যা নতুন লাইনে শেষ হয় না, যেমন:
/usr/bin/perl -ne 'print "$ARGV\n" if /.\z/' -- FILE1 FILE2 ...
vi
/ vim
/ ex
সম্পাদকদের স্বয়ংক্রিয়ভাবে যোগ <EOL>
ফাইলের শেষে এ যদি না ফাইল আগে থেকেই এটা হয়েছে।
সুতরাং চেষ্টা করুন:
vi -ecwq foo.txt
যা এর সমান:
ex -cwq foo.txt
পরীক্ষামূলক:
$ printf foo > foo.txt && wc foo.txt
0 1 3 foo.txt
$ ex -scwq foo.txt && wc foo.txt
1 1 4 foo.txt
একাধিক ফাইল সংশোধন করতে, চেক করুন: প্রচুর ফাইলের জন্য 'ফাইলের শেষে কোনও নিউলাইন নেই' কিভাবে ঠিক করবেন? এসও তে
কেন এটি এত গুরুত্বপূর্ণ? আমাদের ফাইলগুলি পসিক্স সামঞ্জস্যপূর্ণ রাখতে ।
বর্তমান ডিরেক্টরিতে (প্লাস সাব-ডাইরেক্টরিগুলি) সমস্ত ফাইলে স্বীকৃত উত্তর প্রয়োগ করতে:
$ find . -type f -exec sed -i -e '$a\' {} \;
এটি লিনাক্স (উবুন্টু) এ কাজ করে। ওএস এক্স-এ আপনাকে সম্ভবত ব্যবহার করতে হবে -i ''
(অরীক্ষিত)।
find .
ফাইলগুলি সহ সমস্ত ফাইল তালিকাভুক্ত করে .git
। বাদ দিতে:find . -type f -not -path './.git/*' -exec sed -i -e '$a\' {} \;
কমপক্ষে জিএনইউ সংস্করণগুলিতে, ইতিমধ্যে উপস্থিত না থাকলে একটি চূড়ান্ত নিউলাইন যুক্ত করে , কেবলমাত্রgrep ''
awk 1
তার ইনপুটটিকে সহজভাবে বা প্রমিত করে তোলে izes তারা এই প্রক্রিয়াতে ফাইলটি অনুলিপি করে থাকে, যা বড় হলে সময় নেয় (তবে উত্স যেভাবেই পড়তে হবে না খুব বড় হওয়া উচিত?) এবং আপনি যেমন কিছু না করে মোডটাইম আপডেট করেন
mv file old; grep '' <old >file; touch -r old file
(যদিও এটি কোনও ফাইলের জন্য আপনি যাচাই-বাছাই করছেন তা ঠিক আছে কারণ আপনি এটি সংশোধন করেছেন) এবং আপনি আরও সতর্ক না হয়ে থাকলে এটি হার্ডলিঙ্কস, ননডাফল্ট অনুমতি এবং এসিএল ইত্যাদি হারাবে।
grep '' file 1<> file
, যদিও এটি এখনও পুরোপুরি ফাইলটি পড়তে এবং লিখতে পারে।
এটি এআইএক্স কেএস-তে কাজ করে:
lastchar=`tail -c 1 *filename*`
if [ `echo "$lastchar" | wc -c` -gt "1" ]
then
echo "/n" >> *filename*
fi
আমার ক্ষেত্রে, ফাইলটি যদি নতুন লাইনটি অনুপস্থিত, wc
কমান্ডটি একটি মান দেয় 2
এবং আমরা একটি নতুন লাইন লিখি।
যোগ করা হচ্ছে প্যাট্রিক Oscity এর উত্তর , যদি আপনি শুধু একটি নির্দিষ্ট ডিরেক্টরিতে এটা প্রয়োগ করতে চান, আপনি ব্যবহার করতে পারে:
find -type f | while read f; do tail -n1 $f | read -r _ || echo >> $f; done
যে ডিরেক্টরিতে আপনি নতুন লাইন যুক্ত করতে চান এটির ভিতরে এটি চালান।
echo $'' >> <FILE_NAME>
ফাইলের শেষে একটি ফাঁকা রেখা যুক্ত করবে।
echo $'\n\n' >> <FILE_NAME>
ফাইলটির শেষে 3 টি ফাঁকা লাইন যুক্ত করবে।
যদি আপনার ফাইলটি উইন্ডোজ লাইনের শেষের সাথে সমাপ্ত হয় \r\n
এবং আপনি লিনাক্সে থাকেন তবে আপনি এই sed
আদেশটি ব্যবহার করতে পারেন । এটি \r\n
ইতিমধ্যে সেখানে না থাকলে কেবলমাত্র শেষ লাইনে যুক্ত হয়:
sed -i -e '$s/\([^\r]\)$/\1\r\n/'
ব্যাখ্যা:
-i replace in place
-e script to run
$ matches last line of a file
s substitute
\([^\r]\)$ search the last character in the line which is not a \r
\1\r\n replace it with itself and add \r\n
যদি শেষ লাইনে ইতিমধ্যে একটি থাকে \r\n
তবে অনুসন্ধানের regexp মিলবে না, তাই কিছুই হবে না।
আপনি এর fix-non-delimited-line
মতো স্ক্রিপ্ট লিখতে পারেন:
#! /bin/zsh -
zmodload zsh/system || exit
ret=0
for file do
if sysopen -rwu0 -- "$file"; then
if sysseek -w end -1; then
read -r x || print -u0
else
syserror -p "Can't seek in $file before the last byte: "
ret=1
fi
else
ret=1
fi
done
exit $ret
এখানে প্রদত্ত কয়েকটি সমাধানের বিপরীতে, এটি
আপনি উদাহরণস্বরূপ এটি ব্যবহার করতে পারেন:
that-script *.txt
বা:
git ls-files -z | xargs -0 that-script
POSIXly, আপনি এর সাথে সমতুল্য কিছু করতে পারেন
export LC_ALL=C
ret=0
for file do
[ -s "$file" ] || continue
{
c=$(tail -c 1 | od -An -vtc)
case $c in
(*'\n'*) ;;
(*[![:space:]]*) printf '\n' >&0 || ret=$?;;
(*) ret=1;; # tail likely failed
esac
} 0<> "$file" || ret=$? # record failure to open
done