যদি কোনও ফাইলের শেষ চরিত্রটি হয় তবে আমি কীভাবে একটি নিউলাইন মুছতে পারি?


162

আমার কাছে এমন কিছু ফাইল রয়েছে যা আমি যদি কোনও ফাইলের শেষ চরিত্র হয় তবে আমি সর্বশেষ নিউলাইনটি মুছতে চাই। od -cআমাকে দেখায় যে আমি যে কমান্ডটি চালাচ্ছি তা অনুগ্রহ করে নতুন লাইনের সাহায্যে ফাইলটি লিখবে:

0013600   n   t  >  \n

আমি সেডের সাথে কয়েকটি কৌশল চেষ্টা করেছি তবে সবচেয়ে ভাল আমি ভাবতে পারি যে কৌশলটি করছে না:

sed -e '$s/\(.*\)\n$/\1/' abc

কোনও ধারণা কীভাবে এটি করবেন?


4
ইউনিক্স নিউলাইনলাইনগুলির জন্য নিউলাইনটি কেবল একটি চরিত্র। ডস নিউলাইন দুটি চরিত্র। অবশ্যই, আক্ষরিক "\ n" দুটি অক্ষর। আপনি আসলে যা খুঁজছেন?
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

3
যদিও উপস্থাপনাটি হতে পারে \n, লিনাক্সের মধ্যে একটি চরিত্র রয়েছে
প্যাভিয়াম

10
আপনি কেন এটি করতে চান তা ব্যাখ্যা করতে পারেন? পাঠ্য ফাইলগুলি সম্পূর্ণরূপে খালি না হওয়া অবধি শেষ প্রান্তের দিয়ে শেষ হওয়ার কথা । এটা আমার কাছে আশ্চর্যজনক মনে হচ্ছে যে আপনি এমন একটি কাটা ফাইল রাখতে চান?
থমাস প্যাড্রন-ম্যাকার্থি

এরকম কিছু করার স্বাভাবিক কারণটি হ'ল কোনও সিএসভি ফাইলের শেষ লাইন থেকে একটি অনুগামী কমা মুছে ফেলা। সেড ভাল কাজ করে তবে নিউলাইনগুলি অন্যরকম আচরণ করতে হবে।
প্যাভিয়াম

9
@ থমাস প্যাড্রন-ম্যাকার্থি "কম্পিউটিংয়ে প্রতিটি ভাল কারণেই কিছু করার দরকার আছে যা না করার উপযুক্ত কারণ রয়েছে এবং ভিসা বিপরীতে রয়েছে।" -যীশু - "আপনার এটি করা উচিত নয়" এটি একটি ভয়ঙ্কর উত্তর, প্রশ্নই আসেনি। সঠিক বিন্যাসটি হ'ল: [এটি কীভাবে করবেন] তবে [কেন এটি খারাপ ধারণা হতে পারে]। # স্যাক্রিলেজ
কোরি মাওহোর্টার

উত্তর:


223
perl -pe 'chomp if eof' filename >filename2

বা, জায়গায় ফাইল সম্পাদনা করতে:

perl -pi -e 'chomp if eof' filename

[সম্পাদকের দ্রষ্টব্য: -pi -eমূলত এটি ছিল -pieতবে বেশ কয়েকটি মন্তব্যকারী দ্বারা উল্লিখিত এবং @ এইচভিডি দ্বারা ব্যাখ্যা করা হয়েছে যে পরবর্তীকালে কাজ করে না।]

আমি দেখেছি এমন awk ওয়েবসাইটে এটি 'পার্ল নিন্দা' হিসাবে বর্ণনা করা হয়েছিল।

কিন্তু, একটি পরীক্ষায়, এটি কাজ করে।


11
আপনি এটি ব্যবহার করে নিরাপদ করতে পারেন chomp। এবং এটি ফাইল স্লাপিং প্রহার করে।
সিনান Ünür

6
নিন্দা যদিও তা হয়, এটি খুব ভাল কাজ করে। পার্ল -i -pe ফাইলের নাম 'ইফ যদি চম্প' ch ধন্যবাদ.
টড পার্ট্রিজ 'জেন 2'

13
নিন্দা ও ধর্মবিরোধী সম্পর্কে মজার বিষয় হ'ল সাধারণত এটি ঘৃণা করা হয় কারণ এটি সঠিক। :)
ইথার

8
ছোট সংশোধন: আপনি perl -pi -e 'chomp if eof' filenameএকটি অস্থায়ী ফাইল তৈরির পরিবর্তে জায়গাটিতে কোনও ফাইল সম্পাদনা করতে ব্যবহার করতে পারেন
রোমাল্ড ব্রুনেট

7
perl -pie 'chomp if eof' filename-> পার্ল স্ক্রিপ্ট "ইওফ যদি চম্প" খুলতে পারে না: এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই; perl -pi -e 'chomp if eof' filename-> কাজ করে
অ্যাডিটসু ছেড়ে যায় কারণ এসই এভিল

56

শেল কমান্ডের বিকল্পগুলি নতুন লাইনের অক্ষরগুলি সরিয়ে ফেলবে এই বিষয়টি আপনি গ্রহণ করতে পারেন :

সহজ ফর্ম যা ব্যাশ, ksh, zsh এ কাজ করে:

printf %s "$(< in.txt)" > out.txt

পোর্টেবল (পসিএক্স-কমপ্লায়েন্ট) বিকল্প (কিছুটা কম দক্ষ):

printf %s "$(cat in.txt)" > out.txt

বিঃদ্রঃ:

  • যদি একাধিক নিউলাইন চরিত্রের in.txtসাথে শেষ হয় , কমান্ড প্রতিস্থাপনটি তাদের সমস্ত সরিয়ে দেয় - ধন্যবাদ, @ স্পারহাক। (এটি পেছনের নিউলাইনগুলি বাদে শ্বেতস্পেসের অক্ষরগুলি সরাবে না))
  • যেহেতু এই পদ্ধতিটি সম্পূর্ণ ইনপুট ফাইলটিকে মেমরির মধ্যে পড়ে , তাই এটি কেবলমাত্র ছোট ফাইলগুলির জন্যই পরামর্শ দেওয়া হয়।
  • printf %sকোনও নিউলাইন আউটপুটে সংযোজন করা হয়নি তা নিশ্চিত করে (এটি নন-স্ট্যান্ডার্ডের জন্য পসিক্স-সম্মতিজনক বিকল্প echo -n; http://pubs.opengroup.org/onlinepubs/009696799/utilities/echo.html এবং https: //unix.stackexchange দেখুন। কম / এ / 65819 )

অন্যান্য উত্তরের একটি গাইড :

  • তাহলে পার্ল পাওয়া যায়, জন্য যেতে গৃহীত উত্তর - এটা সহজ এবং মেমরি এফিসিয়েন্ট (একবারে পুরো ইনপুট ফাইল পড়া না)।

  • অন্যথায়, ঘোস্টডোগ 74৪ এর আউক উত্তরটি বিবেচনা করুন - এটি অস্পষ্ট, তবে মেমরি-দক্ষ ; একটি আরো ভালো পঠনযোগ্য সমতুল্য (POSIX-অনুবর্তী) হল:

    • awk 'NR > 1 { print prev } { prev=$0 } END { ORS=""; print }' in.txt
    • মুদ্রণটি এক লাইন দ্বারা বিলম্বিত হয় যাতে চূড়ান্ত লাইনটি ENDব্লকে হ্যান্ডেল করা যায় , যেখানে \nআউটপুট-রেকর্ড বিভাজক ( OFS) একটি ফাঁকা স্ট্রিংয়ে সেট করার কারণে এটি পিছনে ছাড়াই মুদ্রণ করা হয় ।
  • আপনি যদি কোনও ভার্বোস, তবে দ্রুত এবং দৃust় সমাধান চান যা সত্যিকার অর্থে জায়গায় সম্পাদনা করে (একটি অস্থায়ী ফাইল তৈরির বিরোধী যা এরপরে মূলটি প্রতিস্থাপন করে), জারকওয়ের পার্ল স্ক্রিপ্টটি বিবেচনা করুন ।


3
এনবি যদি ফাইলটির শেষে একাধিক নিউলাইন থাকে তবে এই কমান্ডটি তাদের সমস্তটি মুছে ফেলবে।
স্পারহক

47

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

head -c -1

একটি শেষ নিউলাইন পরীক্ষা করার জন্য আপনি tailএবং ব্যবহার করতে পারেন wc। নিম্নলিখিত উদাহরণটি অস্থায়ী ফাইলে ফলাফল সংরক্ষণ করে এবং পরে মূলটিকে ওভাররাইট করে:

if [[ $(tail -c1 file | wc -l) == 1 ]]; then
  head -c -1 file > file.tmp
  mv file.tmp file
fi

এছাড়াও আপনি ব্যবহার করতে পারে spongeথেকে moreutils"এ জায়গা" do সম্পাদনা:

[[ $(tail -c1 file | wc -l) == 1 ]] && head -c -1 file | sponge file

আপনি নিজের .bashrcফাইলে এটি স্টাফ করে একটি সাধারণ পুনরায় ব্যবহারযোগ্য ফাংশনও তৈরি করতে পারেন :

# Example:  remove-last-newline < multiline.txt
function remove-last-newline(){
    local file=$(mktemp)
    cat > $file
    if [[ $(tail -c1 $file | wc -l) == 1 ]]; then
        head -c -1 $file > $file.tmp
        mv $file.tmp $file
    fi
    cat $file
}

হালনাগাদ

মতামতগুলিতে কার্লওয়িলবার দ্বারা উল্লিখিত এবং সোরেন্তারের উত্তরে ব্যবহৃত হয়েছে , জায়গা-জায়গায় সম্পাদনা truncate --size=-1প্রতিস্থাপন head -c-1ও সমর্থন করতে পারে ।


3
এখন পর্যন্ত সর্বোত্তম সমাধান। কোনও স্ট্যান্ডার্ড সরঞ্জাম ব্যবহার করে যা প্রতিটি লিনাক্স ডিস্ট্রিবিউশনটিতে সত্যই উপলব্ধ থাকে এবং এটি সংক্ষিপ্ত এবং পরিষ্কার, কোনও শেড বা পার্ল উইজার্ড্রি ছাড়াই।
ডাকারন

2
সুন্দর সমাধান। একটি পরিবর্তন হ'ল আমি মনে করি truncate --size=-1পরিবর্তে আমি head -c -1এটি ব্যবহার করব যেহেতু এটি কেবল ইনপুট ফাইলটি না পড়ার পরিবর্তে ইনপুট ফাইলটির আকার পরিবর্তন করে অন্য কোনও ফাইলে লিখে, এবং আউটপুট ফাইলের সাথে আসলটি প্রতিস্থাপন করে।
কার্ল উইলবার

1
দ্রষ্টব্য যে head -c -1এটি সর্বশেষ অক্ষরটিকে মুছে ফেলবে নির্বিশেষে যদি এটি একটি নতুন লাইন বা না হয়, এজন্য আপনাকে মুছে ফেলার আগে শেষ অক্ষরটি একটি নতুন লাইন কিনা তা আপনাকে পরীক্ষা করতে হবে।
উইসবাকি

দুর্ভাগ্যক্রমে ম্যাকে কাজ করে না। আমার সন্দেহ হয় এটি কোনও বিএসডি ভেরিয়েন্টে কাজ করে না।
এডওয়ার্ড ফালক

16
head -n -1 abc > newfile
tail -n 1 abc | tr -d '\n' >> newfile

সম্পাদনা 2:

এখানে এমন একটি awkসংস্করণ (সংশোধন করা) দেওয়া হয়েছে যা সম্ভাব্য বিশাল অ্যারে জমা করে না:

awk '{if (লাইন) প্রিন্ট লাইন; লাইন = $ 0} END {printf $ 0} 'abc


এটি সম্পর্কে চিন্তা করার ভাল মূল উপায়। ধন্যবাদ ডেনিস
টড পার্ট্রিজ 'জেন 2'

আপনি সঠিক. আমি আপনার awkসংস্করণ স্থগিত এটি দুটি অফসেট লাগে (এবং একটি ভিন্ন পরীক্ষা) এবং আমি কেবল একটি ব্যবহার করেছি। তবে আপনি এর printfপরিবর্তে ব্যবহার করতে পারেন ORS
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

প্রক্রিয়া প্রতিস্থাপনের সাথে আপনি আউটপুটটিকে পাইপ head -n -1 abc | cat <(tail -n 1 abc | tr -d '\n') | ...
বানাতে পারেন

2
মাথা এবং লেজের জন্য -n এর পরিবর্তে -c ব্যবহার করা আরও দ্রুত হওয়া উচিত।
রূডিমিয়ার

1
আমার জন্য, হেড -n -1 এবিসি ফাইলের শেষ প্রকৃত লাইনটি সরিয়ে ফেলেছে, একটি অনুমানযোগ্য নতুন লাইন রেখে; হেড-সি -১
আব্বাস

10

জবুথবু ব্যক্তি

   awk '{q=p;p=$0}NR>1{print q}END{ORS = ""; print p}' file

এখনও আমার কাছে অনেকগুলি চরিত্রের মতো দেখাচ্ছে ... এটি ধীরে ধীরে শিখছে :)। কাজ যদিও। ধন্যবাদ ঘোস্টডগ
টড পার্ট্রিজ 'জেন 2'

1
awk '{ prev_line = line; line = $0; } NR > 1 { print prev_line; } END { ORS = ""; print line; }' fileএটি পড়তে সহজ হওয়া উচিত।
ইয়েভেন পাভলিয়ুক

কেমন হয়: awk 'NR>1 {print p} {p=$0} END {printf $0}' file
ইসহাক

@ সোরন্টার প্রথম আর্গুমেন্টটি printfহ'ল ফর্ম্যাট আর্গুমেন্ট। সুতরাং যদি ইনপুট ফাইলটির এমন কিছু থাকে যা ফর্ম্যাট স্পেসিফায়ার হিসাবে ব্যাখ্যা করা যায় তবে %dআপনি ত্রুটি পাবেন। এটিকে পরিবর্তনের জন্য একটি সমাধান হবেprintf "%s" $0
রবিন এ।

9

সিঙ্গেল-লাইন ফাইলগুলির জন্য খুব সহজ একটি পদ্ধতি, যা কোরিউটিলস থেকে জিএনইউ প্রতিধ্বনি প্রয়োজন:

/bin/echo -n $(cat $file)

এটি খুব শালীন উপায় যদি এটি খুব ব্যয়বহুল না হয় (পুনরাবৃত্তি)।

এটি \nউপস্থিত থাকাকালীন সমস্যাগুলি রয়েছে । এটি একটি নতুন লাইনে রূপান্তরিত হওয়ার সাথে সাথে।
ক্রিস স্ট্রাইজিনস্কি

এছাড়াও বহু-লাইন ফাইলের জন্য কাজ বলে মনে হয় এটা $(...)উদ্ধৃত করা হয়
থর

অবশ্যই তা উদ্ধৃত করা দরকার ... /bin/echo -n "$(cat infile)" এছাড়াও, আমি নিশ্চিত নই যে echoওস / শেল সংস্করণ / ডিস্ট্রোস জুড়ে সর্বাধিক লেন বা শেলটি কী হবে (আমি কেবল এটি গুগল করছিলাম এবং এটি একটি খরগোশের ছিদ্র ছিল), তাই আমি নিশ্চিত নয় যে এটি ছোট ফাইলগুলি ছাড়া অন্য যে কোনও কিছুর জন্য উপযুক্ত (বা পারফরম্যান্ট) হবে - তবে ছোট ফাইলগুলির জন্য দুর্দান্ত।
মাইকেল

8

আপনি যদি এটি সঠিকভাবে করতে চান তবে আপনার এর মতো কিছু দরকার:

use autodie qw(open sysseek sysread truncate);

my $file = shift;
open my $fh, '+>>', $file;
my $pos = tell $fh;
sysseek $fh, $pos - 1, 0;
sysread $fh, my $buf, 1 or die 'No data to read?';

if($buf eq "\n"){
    truncate $fh, $pos - 1;
}

আমরা ফাইলটি পড়তে এবং সংযোজনের জন্য খুলি; সংযোজনের জন্য খোলার অর্থ হ'ল আমরা ইতিমধ্যে seekফাইলটির শেষদিকে এড। তারপরে আমরা ফাইলটির শেষের সংখ্যাসূচক অবস্থান পাই tell। আমরা একটি অক্ষর ফিরে পেতে সেই সংখ্যাটি ব্যবহার করি এবং তারপরে আমরা সেই একটি চরিত্রটি পড়ি। যদি এটি একটি নিউলাইন হয় তবে আমরা সেই নতুন লাইনের আগে ফাইলটিকে অক্ষরটিতে ছাঁটাই করি, অন্যথায় আমরা কিছুই করি না।

এটি কোনও ইনপুটটির জন্য স্থির সময় এবং ধ্রুবক স্পেসে চলে এবং এর জন্য আর কোনও ডিস্ক জায়গার প্রয়োজন হয় না।


2
তবে ফাইলটির মালিকানা / অনুমতিগুলি পুনরায় সেট না করার অসুবিধা রয়েছে ... ভুল, অপেক্ষা করুন ...
ইস্ট

1
শব্দবহুল, তবে দুটো একসাথে দ্রুত এবং শক্তসমর্থ - মনে করা হয় শুধুমাত্র সত্য ইন-জায়গা ফাইল সম্পাদনা উত্তর এখানে (এবং যেহেতু এটি সকলের কাছে সুস্পষ্ট নাও হতে পারে: এটা হল পার্ল স্ক্রিপ্ট)।
mklement0

6

এখানে একটি সুন্দর, পরিপাটি পাইথন সলিউশন। আমি এখানে জ্বলজ্বল হওয়ার চেষ্টা করিনি।

এটি ফাইলের অনুলিপি তৈরি করার পরিবর্তে অনুলিপি পরিবর্তন করে এবং অনুলিপিটির শেষ লাইন থেকে নতুন লাইনটি সরিয়ে দেয়। যদি ফাইলটি বড় হয় তবে এটি সেরা উত্তর হিসাবে নির্বাচিত পার্ল সমাধানের চেয়ে অনেক দ্রুত হবে।

এটি শেষ দুটি বাইট সিআর / এলএফ হলে দুটি বাইট দ্বারা বা শেষ বাইটটি এলএফ হলে একটি বাইট দ্বারা একটি ফাইল কেটে দেয়। শেষ বাইট (গুলি) এলআরএফ না হলে এটি ফাইলটি সংশোধন করার চেষ্টা করে না। এটি ত্রুটিগুলি পরিচালনা করে। পাইথন ২.6 এ পরীক্ষা করা হয়েছে।

এটিকে "স্ট্রাইপ্লাস্ট" নামে একটি ফাইলে রাখুন chmod +x striplast

#!/usr/bin/python

# strip newline from last line of a file


import sys

def trunc(filename, new_len):
    try:
        # open with mode "append" so we have permission to modify
        # cannot open with mode "write" because that clobbers the file!
        f = open(filename, "ab")
        f.truncate(new_len)
        f.close()
    except IOError:
        print "cannot write to file:", filename
        sys.exit(2)

# get input argument
if len(sys.argv) == 2:
    filename = sys.argv[1]
else:
    filename = "--help"  # wrong number of arguments so print help

if filename == "--help" or filename == "-h" or filename == "/?":
    print "Usage: %s <filename>" % sys.argv[0]
    print "Strips a newline off the last line of a file."
    sys.exit(1)


try:
    # must have mode "b" (binary) to allow f.seek() with negative offset
    f = open(filename, "rb")
except IOError:
    print "file does not exist:", filename
    sys.exit(2)


SEEK_EOF = 2
f.seek(-2, SEEK_EOF)  # seek to two bytes before end of file

end_pos = f.tell()

line = f.read()
f.close()

if line.endswith("\r\n"):
    trunc(filename, end_pos)
elif line.endswith("\n"):
    trunc(filename, end_pos + 1)

পিএস "পার্ল গল্ফ" এর চেতনায়, এখানে আমার সবচেয়ে সংক্ষিপ্ত পাইথন সমাধান। এটি স্ট্যান্ডার্ড ইনপুট থেকে মেমরির মধ্যে পুরো ফাইলটি স্লਪਰ্পস করে, শেষের বাইরে সমস্ত নিউলাইনগুলি সরিয়ে দেয় এবং ফলাফলটি স্ট্যান্ডার্ড আউটপুটে লিখে দেয়। পারেলের মতো নিখরচায় নয়; আপনি সামান্য কৌশলযুক্ত দ্রুত স্টাফের জন্য পার্লকে বীট করতে পারবেন না।

কল থেকে "\ n" সরান .rstrip()এবং এটি একাধিক ফাঁকা লাইন সহ ফাইলের শেষে থেকে সমস্ত সাদা স্থান কেটে ফেলবে।

এটি "slurp_and_chomp.py" এ রাখুন এবং তারপরে চালান python slurp_and_chomp.py < inputfile > outputfile

import sys

sys.stdout.write(sys.stdin.read().rstrip("\n"))

os.path.isfile () আপনাকে ফাইল উপস্থিতি সম্পর্কে বলবে। চেষ্টা করা / বাদে ব্যবহার করা বিভিন্ন
রকমের

5

একটি দ্রুত সমাধান gnu ইউটিলিটি ব্যবহার করছে truncate:

[ -z $(tail -c1 file) ] && truncate -s-1 file

পরীক্ষাটি সত্য হবে যদি ফাইলটিতে একটি নতুন নতুন রেখা থাকে।

অপসারণটি খুব দ্রুত, সত্যিকার অর্থে, কোনও নতুন ফাইলের প্রয়োজন নেই এবং অনুসন্ধানটি কেবল একটি বাইট ( tail -c1) থেকে শেষ পর্যন্ত পড়ছে ।


1
ছাঁটাই: ফাইল অপরেনড নিখোঁজ
ব্রায়ান হ্যানায়

2
এটি কেবল উদাহরণের পিছনে থাকা ফাইলের নামটি হারিয়েছে, যেমন, [ -z $(tail -c1 filename) ] && truncate -s -1 filename(অন্যান্য মন্তব্যের জবাবে, truncateকমান্ডটি স্টিডিনের সাথে কাজ করে না, একটি ফাইলের নাম প্রয়োজন)
মাইকেল

4

তবুও আরেকটি পার্ল ডাব্লুটিডিআই:

perl -i -p0777we's/\n\z//' filename

3
l পার্ল-e 'স্থানীয় $ /; $ _ = <>; S / \ N $ //; মুদ্রণ 'a-text-file.txt

আরও দেখুন (নতুন লাইন সহ) কোন চরিত্র মেলান sed মধ্যে


1
এটি সমস্ত নতুনলাইনগুলি বের করে। সমানtr -d '\n'
পরবর্তী বিজ্ঞপ্তি না হওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

এটি খুব ভাল কাজ করে, সম্ভবত প্যাভিয়ামগুলির চেয়ে কম নিন্দনীয়।
টড পার্ট্রিজ 'জেন 2'

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

সেই শিরাতে, বেশিরভাগ জাভাস্ক্রিপ্ট / সিএসএস মিনিফায়ারগুলি পেছনের নতুন লাইনগুলি সরিয়ে ফেলবে, এবং এখনও পাঠ্য ফাইল তৈরি করবে।
ysth

@ রব কেনেডি এবং @ysth: সেখানে একটি আকর্ষণীয় যুক্তি রয়েছে যে এই জাতীয় ফাইলগুলি আসলে পাঠ্য ফাইল এবং এগুলি কেন নয়।
সিনান Novnür

2

ডিডি ব্যবহার:

file='/path/to/file'
[[ "$(tail -c 1 "${file}" | tr -dc '\n' | wc -c)" -eq 1 ]] && \
    printf "" | dd  of="${file}" seek=$(($(stat -f "%z" "${file}") - 1)) bs=1 count=1
    #printf "" | dd  of="${file}" seek=$(($(wc -c < "${file}") - 1)) bs=1 count=1

2
perl -pi -e 's/\n$// if(eof)' your_file

কার্যকরভাবে গৃহীত উত্তর হিসাবে একই, কিন্তু পার্ল-নন ব্যবহারকারীদের কাছে ধারণা অনুসারে পরিষ্কার। নোট জন্য কোন প্রয়োজন নেই যে gবা প্রথম বন্ধনী প্রায় eof: perl -pi -e 's/\n$// if eof' your_file
mklement0

2

ইউনিক্স ফাইল টাইপ ধরে নিচ্ছেন এবং আপনি কেবল সর্বশেষ নিউলাইনটি এটি কাজ করতে চান।

sed -e '${/^$/d}'

এটি একাধিক নতুন লাইনে কাজ করবে না ...

* কেবলমাত্র শেষ লাইনটি ফাঁকা রেখা হলে কাজ করে।


এখানে একটি ব্যাপার sed: সমাধান একটি অ-ফাঁকা শেষ লাইনটি এমনকি কাজ করে stackoverflow.com/a/52047796
wisbucky

1

তবুও অন্য একটি উত্তর এফটিআর (এবং আমার প্রিয়!): প্রতিধ্বনি / বিড়ালটি আপনি যে জিনিসটি ছাঁটাই করতে চান এবং ব্যাকটিক্সের মাধ্যমে আউটপুট ক্যাপচার করতে চান। চূড়ান্ত নিউলাইনটি ছিনিয়ে নেওয়া হবে। উদাহরণ স্বরূপ:

# Sadly, outputs newline, and we have to feed the newline to sed to be portable
echo thingy | sed -e 's/thing/sill/'

# No newline! Happy.
out=`echo thingy | sed -e 's/thing/sill/'`
printf %s "$out"

# Similarly for files:
file=`cat file_ending_in_newline`
printf %s "$file" > file_no_newline

1
আমি দুর্ঘটনায় ক্যাট-প্রিন্টফ কম্বো খুঁজে পেয়েছি (বিপরীত আচরণের চেষ্টা করার চেষ্টা করছিলাম)। মনে রাখবেন এটি কেবল সর্বশেষ নয়, সমস্ত ট্রেলিং নিউলাইনগুলি সরিয়ে ফেলবে ।
টেকনোসরাস

1

প্যাসিক্স সিড:

'$ {/ ^ $ D /}'

$ - match last line


{ COMMANDS } - A group of commands may be enclosed between { and } characters. This is particularly useful when you want a group of commands to be triggered by a single address (or address-range) match.

আমি মনে করি এটি কেবল শেষ সীমাটি ফাঁকা থাকলে এটিকে সরিয়ে ফেলবে। শেষ লাইনটি ফাঁকা না থাকলে এটি অনুসরণকারী নতুনলাইনটি সরিয়ে ফেলবে না। উদাহরণস্বরূপ, echo -en 'a\nb\n' | sed '${/^$/d}'কিছুই মুছে ফেলবে না। echo -en 'a\nb\n\n' | sed '${/^$/d}'পুরো শেষ লাইনটি ফাঁকা হওয়ায় সরানো হবে।
উইসবুকি

1

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

# with trailing newline
echo -en 'foo\nbar\n' | sed '$s/$//' | head -c -1

# still works without trailing newline
echo -en 'foo\nbar' | sed '$s/$//' | head -c -1

# read from a file
sed '$s/$//' myfile.txt | head -c -1

বিবরণ:

  • head -c -1অক্ষরটি নির্বিশেষে স্ট্রিংয়ের সর্বশেষ অক্ষর কেটে দেয়। সুতরাং যদি স্ট্রিংটি একটি নতুন লাইনের সাথে শেষ না হয় তবে আপনি একটি চরিত্র হারাবেন।
  • সুতরাং ঠিকানা যে সমস্যা, আমরা অন্য কমান্ড যদি এক নয় যে একটি trailing সম্পর্কে newline যোগ হবে যোগ করার জন্য: sed '$s/$//'। প্রথম $অর্থ শুধুমাত্র শেষ লাইনে কমান্ড প্রয়োগ করুন। s/$//এর অর্থ "লাইনের শেষ "টিকে" কিছুই না "দিয়ে প্রতিস্থাপন করুন, যা মূলত কিছুই করছে না। তবে এর পিছনে নতুন লাইন যুক্ত করার একটি পার্শ্ব প্রতিক্রিয়া রয়েছে is

দ্রষ্টব্য: ম্যাকের ডিফল্ট বিকল্পটি headসমর্থন করে না -c। পরিবর্তে আপনি করতে brew install coreutilsএবং ব্যবহার করতে পারেন ghead


0

আমি কেবলমাত্র এটি করতে চেয়েছিলাম কোড গল্ফের জন্য এবং তারপরে আমি আমার কোডটি ফাইলের বাইরে অনুলিপি করে একটি echo -n 'content'>fileবিবৃতিতে আটকালাম ।


অর্ধেক দূরত্বে; এখানে সম্পূর্ণ পদ্ধতির ।
mklement0

0
sed ':a;/^\n*$/{$d;N;};/\n$/ba' file

কাজ করে, তবে সমস্ত পেছনের নিউলাইনগুলি সরিয়ে দেয় ।
mklement0

0

আমারও একই সমস্যা ছিল, তবে উইন্ডোজ ফাইলের সাথে কাজ করছিলাম এবং সেই সিআরএলএফ রাখা দরকার - আমার সমাধান লিনাক্সে:

sed 's/\r//g' orig | awk '{if (NR>1) printf("\r\n"); printf("%s",$0)}' > tweaked

0
sed -n "1 x;1 !H
$ {x;s/\n*$//p;}
" YourFile

In n ফাইলের কোনও শেষ উপস্থিতি সরিয়ে ফেলা উচিত। বিশাল ফাইলে কাজ করছেন না (সেফ বাফার সীমাবদ্ধতার কারণে)


0

রুবি:

ruby -ne 'print $stdin.eof ? $_.strip : $_'

বা:

ruby -ane 'q=p;p=$_;puts q if $.>1;END{print p.strip!}'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.