පෙළ ලිපිගොනු නව රේඛාවකින් අවසන් විය යුත්තේ ඇයි?


1498

සියලුම පෙළ ලිපිගොනු නව රේඛාවකින් අවසන් විය යුතුය යන කියමන මෙහි සිටින සෑම කෙනෙකුටම හුරුපුරුදු යැයි මම සිතමි. මම වසර ගණනාවක් තිස්සේ මෙම "රීතිය" ගැන දැන සිටියත් මම නිතරම කල්පනා කළෙමි - ඇයි?


31
නිකම් පිට්ටනියක් විතරයි. එය ගොනුවේ අවසානයේ "නව පේළියක්" නොවේ. එය අන්තිම පේළියේ අවසානයේ "රේඛා බිඳීමක්" වේ. අදාළ ප්‍රශ්නයක් සඳහා හොඳම පිළිතුර බලන්න: stackoverflow.com/questions/16222530/…
gcb

357
තවත් සමහරක් නට්පික් කිරීම සඳහා, ඔහු ඇත්ත වශයෙන්ම “නව පේළියක්” ලියා නැත, ඔහු “නව රේඛාව” ලිවීය, එය නිවැරදිය.
sindrenm

5
හුරුපුරුදු නැත, නමුත් මම පුදුම වන්නේ ඇත්ත වශයෙන්ම එම අතිරික්ත නව
රේඛාව

2
මම දැනට Node.js ප්‍රවාහ භාවිතා කරන්නේ සරල-පෙළ දත්ත රේඛා-විග්‍රහ කිරීම සඳහා වන අතර, පර්යන්ත රේඛා බිඳීම නොමැති වීම කරදරයක් වන බැවින් ධාරාවේ ආදාන පැත්ත අවසන් වූ විට අමතර තර්කනයක් එක් කළ යුතුය. අවසාන පේළිය සැකසෙන බව සහතික කිරීම සඳහා වසා ඇත.
මාර්ක් කේ කෝවන්

26
මෙම Unix සම්බන්ධයෙන් මාර්ගය ගොනු අවසානයේ එහි සාමාන්ය හැසිරීම පහත සඳහන් පරිදි වේ: \ n චරිත රේඛා ආරම්භ නැහැ; ඒ වෙනුවට, ඒවා අවසන් කරයි. ඉතින්, \ n යනු රේඛීය ටර්මිනේටරයක් ​​මිස රේඛා බෙදුම්කරුවෙකු නොවේ. පළමු පේළියට (සියලු රේඛා මෙන්) එය ආරම්භ කිරීමට \ n අවශ්‍ය නොවේ. අවසාන පේළියට (සියලු රේඛා මෙන්) එය අවසන් කිරීමට \ n අවශ්‍ය වේ. ගොනුවේ අවසානයේ \ n අතිරේක පේළියක් සාදන්නේ නැත. කෙසේ වෙතත්, සමහර විට, පෙළ සංස්කාරකවරුන් එහි දෘශ්‍යමාන හිස් පේළියක් එක් කරනු ඇත. ඊමාක්ස් පවා එසේ කරයි, විකල්පයක් ලෙස .
මාර්ක් බ්ලැක්වෙල්

Answers:


1411

නිසා බව ය වන එම POSIX සම්මත අර්ථ දක්වන්නේ කෙසේද මාර්ගය :

3.206 පේළිය
<Newline> නොවන අක්ෂරවල ශුන්‍ය හෝ වැඩි ගණනක් සහ අවසන් වන <newline> අක්ෂර අනුක්‍රමයක්.

එබැවින්, නව රේඛා අක්ෂරයකින් අවසන් නොවන රේඛා සැබෑ රේඛා ලෙස නොසැලකේ. අළුත් රේඛාවක් අවසන් නොකළේ නම් සමහර වැඩසටහන් වල ගොනුවේ අවසාන පේළිය සැකසීමේ ගැටළු ඇත.

ටර්මිනල් ඉමුලේටරයක වැඩ කිරීමේදී මෙම මාර්ගෝපදේශයට අවම වශයෙන් එක් දුෂ්කර වාසියක් ඇත: සියලුම යුනික්ස් මෙවලම් මෙම සම්මුතිය අපේක්ෂා කරන අතර ඒ සමඟ වැඩ කරයි. නිදසුනක් ලෙස, ලිපිගොනු සමඟ සංයුක්ත කරන විට cat, නව රේඛාවකින් අවසන් කරන ලද ගොනුවක් නොමැතිව එකකට වඩා වෙනස් බලපෑමක් ඇති කරයි:

$ more a.txt
foo
$ more b.txt
bar$ more c.txt
baz
$ cat {a,b,c}.txt
foo
barbaz

තවද, පෙර උදාහරණයෙන් පෙන්නුම් කරන පරිදි, විධාන රේඛාවේ ගොනුව පෙන්වන විට (උදා more ) , නව අවසන් කළ ගොනුවක් නිවැරදි දර්ශනයකට හේතු වේ. නුසුදුසු ලෙස අවසන් කරන ලද ගොනුවක් අතුගා දැමිය හැකිය (දෙවන පේළිය).

අනුකූලතාව සඳහා, මෙම රීතිය අනුගමනය කිරීම ඉතා ප්‍රයෝජනවත් වේ - වෙනත් ආකාරයකින් කිරීමෙන් පෙරනිමි යුනික්ස් මෙවලම් සමඟ කටයුතු කිරීමේදී අමතර වැඩක් සිදු වේ.


ඒ ගැන වෙනස් ලෙස සිතන්න: රේඛා නව රේඛාවෙන් අවසන් නොවන්නේ නම්, catප්‍රයෝජනවත් වැනි විධානයන් සෑදීම වඩා දුෂ්කර ය: එවැනි ගොනු සංයුක්ත කිරීමට ඔබ විධානයක් කරන්නේ කෙසේද?

  1. එය එක් එක් ගොනුවේ ආරම්භය නව රේඛාවකට යොමු කරයි, එය ඔබට අවශ්‍ය 95% කාලයයි; ඒත්
  2. එය අතර ඉහත උදාහරණයේ ලෙස, ගොනු දෙකක් අවසන් සහ පළමු පෙළ ඒකබද්ධ ඉඩ b.txtහා c.txt?

ඇත්ත වශයෙන්ම මෙය විසඳිය හැකි නමුත් ඔබ භාවිතය catවඩාත් සංකීර්ණ කළ යුතුය (ස්ථානීය විධාන රේඛා තර්ක එකතු කිරීමෙන්, උදා cat a.txt --no-newline b.txt c.txt), සහ දැන් විධානය එක් එක් ගොනුවට වඩා එය වෙනත් ලිපිගොනු සමඟ අලවන ආකාරය පාලනය කරයි. මෙය නිසැකවම පාහේ පහසු නැත.

… නැතහොත් අවසන් කිරීමට වඩා ඉදිරියට ගෙන යා යුතු රේඛාවක් සලකුණු කිරීම සඳහා ඔබ විශේෂ සෙන්ඩිනල් චරිතයක් හඳුන්වා දිය යුතුය. හොඳයි, දැන් ඔබ ප්‍රතිලෝමව හැර (පොසික්ස් හි ඇති තත්වයටම හිර වී ඇත) (රේඛා අවසන් කිරීමේ අක්‍ෂරයට වඩා රේඛීය අඛණ්ඩතාව).


දැන්, POSIX නොවන අනුකූල පද්ධතිවල (වර්තමානයේ බොහෝ දුරට වින්ඩෝස්), කාරණය වැදගත් ය: ලිපිගොනු සාමාන්‍යයෙන් නව රේඛාවකින් අවසන් නොවන අතර, රේඛාවක (අවිධිමත්) අර්ථ දැක්වීම උදාහරණයක් ලෙස “නව රේඛා මගින් වෙන් කරන ලද පෙළ ” විය හැකිය. (අවධාරණය සටහන් කරන්න). මෙය සම්පූර්ණයෙන්ම වලංගු වේ. කෙසේ වෙතත්, ව්‍යුහාත්මක දත්ත සඳහා (උදා: ක්‍රමලේඛන කේතය) එය විග්‍රහ කිරීම අවම වශයෙන් වඩාත් සංකීර්ණ කරයි: සාමාන්‍යයෙන් එයින් අදහස් කරන්නේ විග්‍රහ කරන්නන් නැවත ලිවිය යුතු බවයි. විග්‍රහකය මුලින් ලියා ඇත්තේ POSIX අර්ථ දැක්වීම මනසේ තබාගෙන නම්, එය පාර්සර්ට වඩා ටෝකන ප්‍රවාහය වෙනස් කිරීම පහසු වනු ඇත - වෙනත් වචන වලින් කිවහොත්, ආදානයේ අවසානයට “කෘතිම නව රේඛාවක්” ටෝකනයක් එක් කරන්න.


11
නිවැරදි කිරීම සඳහා දැන් තරමක් ප්‍රායෝගික නැතත්, පැහැදිලිවම පොසික්ස් විසින් රේඛාව නිර්වචනය කිරීමේදී වැරැද්දක් කර ඇත - මෙම ගැටළුව සම්බන්ධ ප්‍රශ්න ගණනට සාක්ෂි ලෙස. රේඛාවක් <eol>, <eof>, හෝ <eol> <eof> විසින් අවසන් කරන ලද අක්ෂර ශුන්‍ය හෝ වැඩි ගණනක් ලෙස අර්ථ දැක්විය යුතුය. පාර්සර් සංකීර්ණතාව වලංගු කාරණයක් නොවේ. සංකීර්ණත්වය, හැකි සෑම තැනකම, ක්‍රමලේඛකයන්ගේ ප්‍රධානියාගෙන් සහ පුස්තකාලයට ගෙන යා යුතුය.
ඩග් කෝබර්න්

26
Og ඩොග්කොබර්න් මෙම පිළිතුර භාවිතා කළේ මෙය වැරදි ඇයි සහ පොසික්ස් නිවැරදි දේ කළේ ඇයිද යන්න පැහැදිලි කරන පරිපූර්ණ, තාක්ෂණික සාකච්ඡාවක් සඳහා ය. අවාසනාවකට මෙන් මෙම අදහස් මෑතකදී අධික ලෙස උපපරිපාලක වරයෙකු විසින් මකා දමා ඇත. කෙටියෙන් කිවහොත්, එය විග්‍රහ කිරීමේ සංකීර්ණතාව ගැන නොවේ; ඒ වෙනුවට, ඔබේ අර්ථ දැක්වීම catප්‍රයෝජනවත් හා ස්ථාවර ආකාරයකින් කර්තෘ මෙවලම් වලට වඩා දුෂ්කර කරයි .
කොන්රාඩ් රුඩොල්ෆ්

11
ELeon POSIX රීතිය යනු එජ් නඩු අඩු කිරීමයි. එය එතරම් ලස්සනට කරයි. මිනිසුන් මෙය තේරුම් ගැනීමට අපොහොසත් වන ආකාරය මම ඇත්ත වශයෙන්ම තරමක් පාඩු ලබමි: එය රේඛාවක සරලම, ස්වයං-ස්ථාවර අර්ථ දැක්වීමයි.
කොන්රාඩ් රුඩොල්ෆ්

6
@BT මම හිතන්නේ ඔබ සිතන්නේ වඩාත් පහසු කාර්ය ප්‍රවාහයක් පිළිබඳ මගේ උදාහරණය තීරණයට හේතුව බවයි. එය එසේ නොවේ, එය ප්‍රතිවිපාකයක් පමණි. මෙම හේතුව එම POSIX පාලනය සරලතම බව, පාලනය වන අතර, වන පහසුම වූ ව්යාකරණ විග්රහ හිටියෙ කටයුතු කරයි බව ය. අප විවාදයට පවා ඇති එකම හේතුව වන්නේ වින්ඩෝස් එය වෙනස් ආකාරයකින් සිදු කිරීම සහ එහි ප්‍රති ence ලයක් ලෙස POSIX ලිපිගොනු අසමත් වන මෙවලම් ගණනාවක් තිබීමයි. හැමෝම POSIX කළා නම් කිසිම ප්‍රශ්නයක් නැහැ. නමුත් මිනිසුන් පැමිණිලි කරන්නේ වින්ඩෝස් ගැන නොව පොසික්ස් ගැන ය.
කොන්රාඩ් රුඩොල්ෆ්

7
@BT මම වින්ඩෝස් වෙත යොමු කරන්නේ පොසික්ස් රීති අර්ථවත් නොවන අවස්ථා පෙන්වා දීමට පමණි (වෙනත් වචන වලින් කිවහොත්, මම ඔබට ඇටකටු විසි කළෙමි). මෙම සාකච්ඡාවේදී නැවත එය සඳහන් නොකිරීම ගැන මම සතුටු වෙමි. නමුත් පසුව ඔබගේ හිමිකම් පෑම ඊටත් වඩා අර්ථවත් කරයි: පොසික්ස් වේදිකාවල විවිධ රේඛා අවසන් සම්මුතීන් සමඟ පෙළ ලිපිගොනු සාකච්ඡා කිරීම අර්ථවත් නොවේ, මන්ද ඒවා නිෂ්පාදනය කිරීමට හේතුවක් නැත. වාසිය කුමක්ද? වචනාර්ථයෙන් කිසිවක් නැත. - සාරාංශයක් ලෙස, මම ඇත්තටම වෛරය මෙම පිළිතුර (හෝ POSIX පාලනය) තේරෙන්නේ නැහැ යහපාලනය වේ. අවංකව කිවහොත් එය සම්පූර්ණයෙන්ම අතාර්කික ය.
කොන්රාඩ් රුඩොල්ෆ්

283

සෑම පේළියක්ම අවසන් රේඛාව ඇතුළුව නව රේඛා අක්ෂරයකින් අවසන් කළ යුතුය. සමහර වැඩසටහන් වලට නව රේඛාවක් අවසන් නොවන්නේ නම් ගොනුවේ අවසාන පේළිය සැකසීමේ ගැටළු ඇත.

එය නිසා ගල්ෆ් නොවේ ඒ ගැන අනතුරු අඟවයි නොහැකි ගොනුව සැකසීමට, නමුත් එය නිසා යුතු සම්මත කොටසක් ලෙස.

සී භාෂා ප්‍රමිතිය පවසන්නේ හිස් නොවන ප්‍රභව ගොනුවක් නව රේඛා අක්ෂරයකින් අවසන් වන අතර එය බැක්ස්ලෑෂ් අක්ෂරයකට පෙර නොවිය යුතු බවයි.

මෙය “විය යුතු” වගන්තියක් බැවින්, මෙම රීතිය උල්ලං for නය කිරීම සඳහා අප විසින් රෝග විනිශ්චය පණිවිඩයක් විමෝචනය කළ යුතුය.

මෙය ANSI C 1989 ප්‍රමිතියේ 2.1.1.2 වගන්තියේ ඇත. ISO C 1999 ප්‍රමිතියේ 5.1.1.2 වගන්තිය (සහ බොහෝ විට ISO C 1990 ප්‍රමිතිය ද විය හැකිය).

යොමුව: GCC / GNU තැපැල් ලේඛනාගාරය .


17
කරුණාකර හොඳ වැඩසටහන් ලියන්න එවිට එක්කෝ එම නව රේඛාව සැකසීමේදී අවශ්‍ය තැනට ඇතුළු කිරීමට හෝ "අතුරුදහන් වූවන්" නිසි ලෙස හැසිරවීමට ඉඩ සලසයි ... ඒවා ඇත්ත වශයෙන්ම අතුරුදහන් නොවේ
ටොබිබීර්

4
IlBilltheLizard, "සමහර වැඩසටහන් වලට නව රේඛාවක් අවසන් නොවන්නේ නම් ගොනුවේ අවසාන පේළිය සැකසීමේ ගැටළු තිබේ" යන්නට උදාහරණ මොනවාද?
පැසීරියර්

4
Line පේසීරියර් wc -lනව රේඛාවක් අවසන් නොකළහොත් ගොනුවේ අවසාන පේළිය ගණන් නොගනී. එසේම, catපළමු ගොනු අවසන් රේඛාව නව පේළියකට යොමු කිරීමේ අක්ෂරය අවසන් නැති නම් එකක් බවට ඉදිරි ගොනුවේ පළමු පෙළ සමග ගොනු අවසන් රේඛාව එකතු වනු ඇත. නව රේඛා පරිසීමකය ලෙස සොයන ඕනෑම වැඩසටහනකට මෙය අවුල් කිරීමේ හැකියාවක් ඇත.
බිල් ද කටුස්

2
IlBilltheLizard, මම අදහස් කළේ දැනටමත් සඳහන්wc කර ඇත ....
පැසීරියර්

2
Ill බිල්ට්ලයිසාර්ඩ්, මගේ නරක, පැහැදිලි කිරීම සඳහා: නව රේඛාවක් අවසන් නොකළේ නම් ගොනුවක අවසාන පේළිය සැකසීමේදී ගැටළු ඇති වැඩසටහන් සඳහා උදාහරණ මොනවාද? (මේ වන විටත් ත්‍රෙඩ් එකේ විශාල වශයෙන් සඳහන් කර ඇති catසහ හැර wc)
පැසීරියර්

118

මෙම පිළිතුර මතයට වඩා තාක්ෂණික පිළිතුරක් ලබා ගැනීමේ උත්සාහයකි.

අපට පොසික්ස් පිරිසිදු කරන්නන් වීමට අවශ්‍ය නම්, අපි රේඛාවක් අර්ථ දක්වන්නේ:

<Newline> නොවන අක්ෂරවල ශුන්‍ය හෝ වැඩි ගණනක් සහ අවසන් වන <newline> අක්ෂර අනුක්‍රමයක්.

මුලාශ්‍රය: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_206

අසම්පූර්ණ රේඛාවක් ලෙස:

ගොනුවේ අවසානයේ ඇති <Newline> නොවන අක්ෂර එකක් හෝ වැඩි ගණනක අනුක්‍රමයකි.

මූලාශ්රය: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_195

පෙළ ගොනුවක්:

පේළි ශුන්‍ය හෝ වැඩි ගණනකට සංවිධානය කර ඇති ගොනුවක්. රේඛාවල NUL අක්ෂර අඩංගු නොවන අතර <newline> අක්‍ෂරය ද ඇතුළුව දිග {LINE_MAX} බයිට් ඉක්මවා යා නොහැක. POSIX.1-2008 පෙළ ලිපිගොනු සහ ද්විමය ලිපිගොනු අතර වෙනස හඳුනා නොගත්තද (ISO C ප්‍රමිතිය බලන්න), බොහෝ උපයෝගිතා නිපදවන්නේ පෙළ ගොනුවල ක්‍රියාත්මක වන විට පුරෝකථනය කළ හැකි හෝ අර්ථවත් ප්‍රතිදානයක් පමණි. එවැනි සීමාවන් ඇති සම්මත උපයෝගිතා සෑම විටම ඒවායේ STDIN හෝ INPUT FILES අංශවල "පෙළ ගොනු" නියම කරයි.

මූලාශ්රය: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_397

නූලක් ලෙස:

පළමු ශුන්‍ය බයිට් එක ඇතුළුව සහ අවසන් කරන ලද බයිට් අනුක්‍රමික අනුක්‍රමයකි.

මූලාශ්රය: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_396

මෙම එතැන් සිට, අප විසින් කරනු එකම අවස්ථාව ලබාගත හැක්කේ හැකි කරුණු කිසිවක් වර්ගය මුහුණ අපි සංකල්පය සමග ගනුදෙනු නම් වේ රේඛාව ලෙස ගොනුවක් හෝ ගොනු වල පෙළ ගොනුවක් (අ සිද්ධියක් බව පෙළ ගොනුවක් ශුන්ය සංවිධානයක් වන හෝ වැඩි පේළි, සහ අප දන්නා රේඛාවක් <newline> සමඟ අවසන් විය යුතුය).

කාරණය : wc -l filename.

සිට wcඅත්ෙපොත අප කියවන:

රේඛාවක් අර්ථ දැක්වෙන්නේ <newline> අක්ෂරයකින් වෙන් කරන ලද අක්ෂර මාලාවක් ලෙස ය.

ජාවාස්ක්‍රිප්ට්, HTML, සහ CSS ලිපිගොනු ඒවා පෙළ ලිපිගොනු බවට පත්වීමෙන් ඇඟවෙන්නේ කුමක්ද?

බ්‍රව්සර්, නවීන IDEs සහ වෙනත් ඉදිරිපස යෙදුම් වල EOF හි EOL මඟ හැරීමේ ගැටළු නොමැත. යෙදුම් ගොනු නිසි ලෙස විග්‍රහ කරනු ඇත. සියලුම මෙහෙයුම් පද්ධති POSIX ප්‍රමිතියට අනුකූල නොවිය යුතු බැවින්, OS නොවන මෙවලම් (උදා: බ්‍රව්සර්) POSIX ප්‍රමිතියට (හෝ ඕනෑම OS මට්ටමේ ප්‍රමිතියකට) අනුව ලිපිගොනු හැසිරවීම ප්‍රායෝගික නොවේ.

එහි ප්‍රති As ලයක් වශයෙන්, EOF හි EOL යෙදුම් මට්ටමින් කිසිදු negative ණාත්මක බලපෑමක් ඇති නොකරනු ඇතැයි අපට සාපේක්ෂව විශ්වාස කළ හැකිය - එය යුනික්ස් මෙහෙයුම් පද්ධතියක් මත ක්‍රියාත්මක වන්නේ නම් නොසලකා.

මෙම අවස්ථාවෙහිදී, සේවාදායකයාගේ පැත්තෙන් JS, HTML, CSS සමඟ ගනුදෙනු කිරීමේදී EOF හි EOL මඟ හැරීම ආරක්ෂිත බව අපට විශ්වාසයෙන් කිව හැකිය. ඇත්ත වශයෙන්ම, <newline> අඩංගු නොවන මෙම ලිපිගොනු වලින් එකක් අවම කිරීම ආරක්ෂිත බව අපට ප්‍රකාශ කළ හැකිය.

අපට මෙය තවත් එක් පියවරක් ඉදිරියට ගෙන යා හැකි අතර, NodeJS සම්බන්ධයෙන් ගත් කල, එයද POSIX ප්‍රමිතියට අනුගත විය නොහැකි අතර එය POSIX නොවන අනුකූල පරිසරයන් තුළ ක්‍රියාත්මක කළ හැකිය.

එවිට අපට ඉතිරිව ඇත්තේ කුමක්ද? පද්ධති මට්ටමේ මෙවලම්.

මෙයින් අදහස් වන්නේ පැනනැඟිය හැකි එකම ගැටළුව වන්නේ පොසික්ස් හි අර්ථ නිරූපණයට අනුගත වීමට උත්සාහ කරන මෙවලම් (උදා: පෙන්වා ඇති පරිදි රේඛාවක අර්ථ දැක්වීම wc).

එසේ වුවද, සියලුම ෂෙල් වෙඩි ස්වයංක්‍රීයව පොසික්ස් වලට අනුගත නොවනු ඇත. උදාහරණයක් ලෙස බෑෂ් POSIX හැසිරීමට පෙරනිමි නොවේ. එය සක්‍රීය කිරීම සඳහා ස්විචයක් ඇත : POSIXLY_CORRECT.

EOL හි වටිනාකම පිළිබඳ සිතීමට ආහාර <newline>: https://www.rfc-editor.org/old/EOLstory.txt

සියලු ප්‍රායෝගික අභිප්‍රායන් සහ අරමුණු සඳහා මෙවලම් ධාවන පථයේ රැඳී සිටීම, අපි මෙය සලකා බලමු:

EOL නොමැති ගොනුවක් සමඟ වැඩ කරමු. මෙම උදාහරණයේ ඇති ගොනුව EOL නොමැති කුඩා ජාවාස්ක්‍රිප්ට් එකකි.

curl http://cdnjs.cloudflare.com/ajax/libs/AniJS/0.5.0/anijs-min.js -o x.js
curl http://cdnjs.cloudflare.com/ajax/libs/AniJS/0.5.0/anijs-min.js -o y.js

$ cat x.js y.js > z.js

-rw-r--r--  1 milanadamovsky   7905 Aug 14 23:17 x.js
-rw-r--r--  1 milanadamovsky   7905 Aug 14 23:17 y.js
-rw-r--r--  1 milanadamovsky  15810 Aug 14 23:18 z.js

catගොනු විශාලත්වය හරියටම එහි තනි කොටස්වල එකතුව බව සලකන්න . ජාවාස්ක්‍රිප්ට් ලිපිගොනු සංක්ෂිප්ත කිරීම ජේඑස් ලිපිගොනු සඳහා සැලකිලිමත් වන්නේ නම්, වඩාත් සුදුසු වන්නේ සෑම ජාවාස්ක්‍රිප්ට් ගොනුවක්ම අර්ධ මහා බඩවැලකින් ආරම්භ කිරීමයි.

මෙම ත්‍රෙඩ් catඑකේ වෙනත් අයෙකු සඳහන් කර ඇති පරිදි: ගොනු දෙකක් වෙනුවට එක් පේළියක් පමණක් වන ගොනු දෙකක් ඔබට අවශ්‍ය නම් කුමක් කළ යුතුද? වෙනත් වචන වලින් කිවහොත්, catඑය කළ යුතු දේ කරන්න.

මෙම manපිළිබඳ catපමණක් EOF ආදානය කළ නොහැකි <නව පේළියකට යොමු කිරීමේ අක්ෂරය> කියවීම සඳහන් කර ඇත. බව සටහන -nපිළිබඳ ස්විචය catද නොවන <නව පේළියකට යොමු කිරීමේ අක්ෂරය> අවසන් රේඛාව (හෝ මුද්රණය ඇත අසම්පූර්ණ රේඛාව ලෙස) මාර්ගය - හි ගණන් ආරම්භ සිද්ධියක් බව 1 (අනුව man.)

-n නිමැවුම් රේඛා අංක 1 සිට ආරම්භ කරන්න.

POSIX විසින් රේඛාවක් නිර්වචනය කරන්නේ කෙසේදැයි දැන් අපට වැටහී ඇති හෙයින් , මෙම හැසිරීම නොපැහැදිලි හෝ සැබවින්ම අනුකූල නොවන බවට පත්වේ.

දී ඇති මෙවලමක අරමුණ සහ අනුකූලතාවය අවබෝධ කර ගැනීම EOL සමඟ ලිපිගොනු අවසන් කිරීම කෙතරම් තීරණාත්මකද යන්න තීරණය කිරීමට උපකාරී වේ. C, C ++, Java (JARs) යනාදියෙහි ... සමහර ප්‍රමිතීන් වලංගුභාවය සඳහා නව රේඛාවක් නියම කරනු ඇත - JS, HTML, CSS සඳහා එවැනි ප්‍රමිතියක් නොමැත.

නිදසුනක් ලෙස, wc -l filenameඑකක් භාවිතා කිරීම වෙනුවට කළ හැකි අතර awk '{x++}END{ print x}' filename, අප විසින් ලියන ලද ක්‍රියාවලියක් සැකසීමට අවශ්‍ය විය හැකි ගොනුවකින් කර්තව්‍යයේ සාර්ථකත්වය අනතුරට ලක් නොවන බවට සහතික වන්න (උදා: අපි අවම කළ JS වැනි තෙවන පාර්ශවීය පුස්තකාලයක් curl) - අපගේ හැර පොසික්ස් අනුකූල අර්ථයෙන් රේඛා ගණනය කිරීම සැබවින්ම අභිප්‍රාය විය .

නිගමනය

JS, HTML, සහ CSS වැනි ඇතැම් පෙළ ලිපිගොනු සඳහා EOF හි EOL මඟ හැරීම negative ණාත්මක බලපෑමක් ඇති කරන සැබෑ ජීවිත භාවිත අවස්ථා ඉතා අල්පය. අපි <Newline> පැමිණීම මත විශ්වාසය තබන්නේ නම්, අපි අපගේ මෙවලම් වල විශ්වසනීයත්වය සීමා කරන්නේ අප විසින් ලියන ලද ලිපිගොනු වලට පමණක් වන අතර තෙවන පාර්ශවීය ලිපිගොනු මඟින් හඳුන්වා දිය හැකි දෝෂ වලට අපව විවෘත කරමු.

කතාවේ සදාචාරය: EOF හි EOL මත යැපීමේ දුර්වලතාවයක් නොමැති ඉංජිනේරු මෙවලම්.

JS, HTML සහ CSS වලට අදාළ වන පරිදි භාවිත අවස්ථා පළ කිරීමට නිදහස්ව සිටින්න, එහිදී EOL මඟ හැරීම අහිතකර බලපෑමක් ඇති කරන්නේ කෙසේදැයි අපට පරීක්ෂා කළ හැකිය.


2
POSIX ප්‍රශ්නය ටැග් කර නැත ... MVS / OS රේඛා අවසානය ගැන විමසිල්ලෙන් සිටිනවාද? හෝ MS-DOS රේඛා අවසානයද? මාර්ගය වන විට, සියලු දන්නා පොසික්ස් පද්ධති අවසාන රේඛා අවසානයකින් තොරව පෙළ ලිපිගොනු වලට ඉඩ දෙයි (කර්නලය තුළ “පෙළ ගොනුව” විශේෂ ප්‍රතිකාරයක් ඇති පොසික්ස් අනුකූල හිමිකම් පෑමේ පද්ධතියක් නොමැති නම් නිසි නව රේඛාවක් ඇතුළත් කිරීමට එය ඉඩ නොදේ. එය)
ලුයිස් කොලරාඩෝ

63

එය අතර වෙනස හා සම්බන්ධ විය හැකිය :

  • පෙළ ගොනුව (සෑම පේළියක්ම පේළියේ අවසානයකින් අවසන් වේ)
  • ද්විමය ගොනුව (කථා කිරීමට සත්‍ය "රේඛා" නොමැති අතර ගොනුවේ දිග ආරක්ෂා විය යුතුය)

සෑම පේළියක්ම පේළියේ අවසානයකින් අවසන් වන්නේ නම්, උදාහරණයක් ලෙස, පෙළ ලිපිගොනු දෙකක් සමපාත කිරීමෙන් පළමු ධාවනයේ අවසාන පේළිය දෙවන පේළියේ පළමු පේළියට ඇතුළත් වේ.

ප්ලස්, සංස්කාරකයෙකුට ගොනුව අවසන් රේඛාවෙන් අවසන් වේද, එහි දේශීය විකල්පය වන 'ඉයෝල්' තුළ සුරකිනු ඇත්ද, ගොනුව ලිවීමේදී එය භාවිතා කරයිද යන්න පරීක්ෂා කළ හැකිය.

මීට වසර කිහිපයකට පෙර (2005) බොහෝ කතුවරුන් (ZDE, Eclipse, Scite, ...) එම අවසාන EOL "අමතක" කර ඇති අතර එය එතරම් අගය නොකළේය .
එපමණක් නොව, ඔවුන් එම අවසාන EOL වැරදි ලෙස අර්ථකථනය කළේ, 'නව රේඛාවක් ආරම්භ කරන්න' ලෙස වන අතර, ඇත්ත වශයෙන්ම වෙනත් පේළියක් දැනටමත් පවතින ආකාරයට ප්‍රදර්ශනය කිරීමට පටන් ගනී.
ඉහත සංස්කාරක වලින් එකක් විවෘත කිරීමට සාපේක්ෂව vim වැනි හොඳින් හැසිරෙන පෙළ සංස්කාරකයක් සහිත 'නිසි' පෙළ ගොනුවක් සමඟ මෙය ඉතා පැහැදිලිව දැකගත හැකි විය. එය ගොනුවේ සැබෑ අන්තිම පේළියට පහළින් අතිරේක පේළියක් පෙන්වයි. ඔබ මේ වගේ දෙයක් දකිනවා:

1 first line
2 middle line
3 last line
4

11
+1. මෙම ගැටලුව අත්විඳින අතරතුර මම මෙම SO ප්‍රශ්නය සොයාගෙන ඇත. එය ඉතා මෙම "ව්යාජ" පසුගිය මාර්ගය, සහ මම එය ඉවත් නම්, GIT (සහ EOL බලාපොරොත්තු වන බව අනෙකුත් සියලුම unix මෙවලම් සඳහා) පැමිණිලි පෙන්වන්න එක්ලිප්ස් වල මැලේරියාව. මෙය 2005 දී පමණක් නොවන බව සලකන්න: සූර්යග්‍රහණය 4.2 ජූනෝට තවමත් මෙම ගැටළුව තිබේ.
MestreLion


46

සමහර මෙවලම් මෙය අපේක්ෂා කරයි. උදාහරණයක් ලෙස, wcමෙය අපේක්ෂා කරයි:

$ echo -n "Line not ending in a new line" | wc -l
0
$ echo "Line ending with a new line" | wc -l
1

22
මම "සමහරක්" නොකියමි, බොහෝ මෙවලම් පෙළ ලිපිගොනු සඳහා බලාපොරොත්තු වේ, එසේ නොවේ නම්. cat, git, diff, wc, grep, sed ... ලැයිස්තුව අති විශාලයි
MestreLion

බොහෝ විට මෙය “රේඛාවක්” පිළිබඳ පොසික්ස් අර්ථ දැක්වීම තුළ ක්‍රියාත්මක වනවා සේම, මෙය අපේක්ෂාwc නොකරන බව කෙනෙකුට පැවසිය හැකිය .
ගිල්ඩන්ස්ටර්න්

@Guildenstern සඳහා ඉවෙන් අර්ථ දැක්වීම වනු ඇත wc -lමුද්රණය කිරීමට 1අවස්ථා දෙකෙහිදීම, නමුත් සමහර අය දෙවන නඩුව මුද්රණය කළ යුතු කියන්න පුළුවන් 2.
Flimm

L ෆ්ලිම් ඔබ පොසික්ස් \n/ යුනික්ස් මෙන් රේඛීය බෙදුම්කරුවෙකු ලෙස නොව රේඛීය ටර්මිනේටරයක් ලෙස සිතන්නේ නම් , දෙවන නඩුව 2 මුද්‍රණය කිරීම අපේක්ෂා කිරීම නියත වශයෙන්ම පිස්සුවකි.
semicolon

21

මූලික EOL EOF නොලැබුනේ නම් ගොනු නිවැරදිව සකසනු නොලබන බොහෝ වැඩසටහන් තිබේ.

G ප්‍රමිතියෙහි කොටසක් ලෙස අපේක්ෂා කරන බැවින් GCC ඔබට මේ ගැන අනතුරු අඟවයි. (5.1.1.2 වගන්තිය පෙනෙන පරිදි)

"ගොනුව අවසානයේ නව රේඛාවක් නොමැත" සම්පාදක අනතුරු ඇඟවීම


5
ගොනුව සැකසීමට GCC හට හැකියාවක් නැත, එය C ප්‍රමිතියේ කොටසක් ලෙස අනතුරු ඇඟවීම ලබා දිය යුතුය.
බිල් ද කටුස්සා

IIRC, MSVC 2005 සී ලිපිගොනු අසම්පූර්ණ රේඛාවලින් අවසන් වූ අතර ඒවා සම්පාදනය කිරීම ප්‍රතික්ෂේප කළේය.
මාර්ක් කේ කෝවන්

17

වෙනම භාවිත නඩුවක්: ඔබේ පෙළ ගොනුව අනුවාදය පාලනය කරන විට (මෙම අවස්ථාවේදී එය විශේෂයෙන්ම git යටතේ වුවද එය අනෙක් අයටද අදාළ වේ). ගොනුවේ අවසානයට අන්තර්ගතය එකතු කර ඇත්නම්, කලින් පේළියේ අවසන් පේළිය නව රේඛා අක්ෂරයක් ඇතුළත් කිරීම සඳහා සංස්කරණය කරනු ලැබේ. මෙයින් අදහස් කරන්නේ blameඑම පේළිය අවසන් වරට සංස්කරණය කළේ කවදාදැයි සොයා බැලීමට ගොනුව ඇතුලත් කිරීමෙන් පෙළ එකතු කිරීමක් පෙන්වනු ඇති බවයි.


1
"නව රේඛා" ( \n) වෙනුවට "නව රේඛා" හඳුනා ගැනීම සඳහා වෙනස සහ දොස් යාවත්කාලීන කළ යුතුය . ගැටළුව විසඳා ඇත.
ඇන්ඩෲ

1
සුදු අවකාශයේ වෙනස්කම් නොසලකා හැරීමට ඔබට -w ටැගය භාවිතා කළ හැකිය, නමුත් ඒවා පෙරනිමිය නොවේ.
රොබින් විට්ල්ටන්

16

මෙය ආරම්භ වන්නේ සරල පර්යන්ත භාවිතා කළ මුල් අවධියේ සිට ය. මාරු කරන ලද දත්තවල 'ෆ්ලෂ්' අවුලුවාලීමට නව රේඛා ප්‍රස්ථාරය භාවිතා කරන ලදී.

අද, නව රේඛා ප්‍රස්ථාරය තවදුරටත් අවශ්‍ය නොවේ. නව රේඛාව නොමැති නම් බොහෝ යෙදුම් වලට තවමත් ගැටලු ඇති බව විශ්වාසයි, නමුත් එම යෙදුම්වල දෝෂයක් ලෙස මම සලකමි.

කෙසේ වෙතත් ඔබට නව රේඛාව අවශ්‍ය වන පෙළ ගොනු ආකෘතියක් තිබේ නම් , ඔබට සරල දත්ත සත්‍යාපනය ඉතා ලාභදායී වේ: ගොනුව අවසන් වන්නේ නව රේඛාවක් නොමැති රේඛාවකින් නම්, ගොනුව කැඩී ඇති බව ඔබ දන්නවා. එක් එක් පේළිය සඳහා එක් අමතර බයිට් එකක් පමණක් ඇති විට, ඔබට ඉහළ නිරවද්‍යතාවයකින් හා කැඩුණු ලිපිගොනු හඳුනාගත හැකිය.


15
වර්තමානයේ පෙළ ලිපිගොනු සඳහා ඊඕඑෆ් හි නව රේඛාව අවශ්‍යතාවයක් නොවිය හැකි නමුත් එය බොහෝ යුනික්ස් මෙවලම් ස්ථාවර ප්‍රති .ල සමඟ එකට වැඩ කිරීමට උපකාරී වන ප්‍රයෝජනවත් සම්මුතියකි . එය කිසිසේත්ම දෝෂයක් නොවේ.
MestreLion

14
අපෙන් බොහෝ දෙනෙක් යුනික්ස් මෙවලම් කිසිසේත් භාවිතා නොකරන අතර අපි එය ගණන් ගන්නේ නැත.
ඩේව්වාලි

12
එය හුදෙක් යුනික්ස් මෙවලම් පමණක් නොවේ, ඕනෑම මෙවලමක් වඩා හොඳින් ක්‍රියා කරනු ඇති අතර / හෝ සංවේදී ගොනු ආකෘති උපකල්පනය කළ හැකි නම් වඩාත් සරලව කේතනය කරනු ඇත.
සෑම් වොට්කින්ස්

2
Am සෑම් වොට්කින්ස් එකඟ වන්නේ සරල ලෙස අර්ථ දක්වා ඇති ආකෘති තිබීම හොඳයි. කේතය තවමත් සත්‍යතාවයට අවශ්‍ය වන අතර දත්ත ආකෘති අනුකූල බව උපකල්පනය නොකරයි .
chux - මොනිකා

8
EstMestreLion මෙය මෝඩ ප්‍රමිතීන්ට අනුකූල වන නරක මෙවලම් සමූහයකින් නිෂ් less ල උරුමයකි . අන්තවාදී ක්‍රමලේඛනයේ මෙම කෞතුක වස්තු (එනම් සෑම දෙයක්ම ගොනුව! සෑම දෙයක්ම සරල පෙළ කතා කළ යුතුය!) ඔවුන්ගේ සොයාගැනීමෙන් පසු ඉක්මනින් මිය නොගිය අතර ඒවා ඉතිහාසයේ එක්තරා මොහොතක ලබා ගත හැකි එකම මෙවලම වන බැවිනි. C ට C ++ විසින් අභිබවා යන ලදි, එය POSIX හි කොටසක් නොවේ, එයට EOF හි EOL අවශ්‍ය නොවේ, සහ එහි භාවිතය (පැහැදිලිවම) * නික්ස් ලුඩිස්ට්වරුන් විසින් අධෛර්යමත් කරනු ලැබේ.
polkovnikov.ph

13

ඉහත ප්‍රායෝගික හේතු වලට අමතරව, යුනික්ස් (තොම්සන්, රිචී සහ වෙනත්) හි ආරම්භකයින් හෝ ඔවුන්ගේ බහුකාර්ය පූර්වගාමීන් රේඛා බෙදුම්කරුවන්ට වඩා රේඛීය ටර්මිනේටර් භාවිතා කිරීමට න්‍යායාත්මක හේතුවක් ඇති බව වටහා ගත්තේ නම් මා පුදුම නොවනු ඇත: රේඛාව සමඟ ටර්මිනේටර්, ඔබට හැකි සියලුම රේඛා ගොනු කේතනය කළ හැකිය. රේඛා බෙදුම්කරුවන් සමඟ, ශුන්‍ය රේඛා ගොනුවක් සහ තනි හිස් රේඛාවක් අඩංගු ගොනුවක් අතර වෙනසක් නැත; මේ දෙකම ශුන්‍ය අක්ෂර අඩංගු ගොනුවක් ලෙස කේතනය කර ඇත.

ඉතින්, හේතු:

  1. POSIX විසින් එය අර්ථ දක්වන ආකාරය එයයි.
  2. මන්ද සමහර මෙවලම් එය නොමැතිව හෝ වැරදි ලෙස හැසිරෙන බැවිනි. උදාහරණයක් වශයෙන්,wc -l රේඛාවකින් අවසන් නොවන්නේ නම් අවසාන "රේඛාවක්" ගණන් නොගනී.
  3. එය සරල හා පහසු නිසා. යුනික්ස් හි, catක්‍රියා කරන අතර එය සංකූලතාවයකින් තොරව ක්‍රියා කරයි. එය අර්ථ නිරූපණයකින් තොරව එක් එක් ගොනුවේ බයිට් පිටපත් කරයි. මම හිතන්නේ නැහැ ඩොස් එකකට සමානයි කියලා cat. භාවිතා copy a+b cකිරීමෙන් අවසන් ගොනුවේ aපළමු පේළිය සමඟ ඒකාබද්ධ bවේ.
  4. මන්ද යත් ශුන්‍ය රේඛා ගොනුවක් (හෝ ප්‍රවාහයක්) එක් හිස් රේඛාවක ගොනුවකින් වෙන්කර හඳුනාගත හැකි බැවිනි.

12

මම මෙය වසර ගණනාවක් තිස්සේ කල්පනා කර ඇත්තෙමි. නමුත් මට අද හොඳ හේතුවක් හමු විය.

සෑම පේළියකම වාර්තාවක් ඇති ගොනුවක් ගැන සිතන්න (උදා: CSV ගොනුවක්). පරිගණකය ගොනුවේ අවසානයේ වාර්තා ලියන බවත්. නමුත් එය හදිසියේම කඩා වැටුණි. ගී අවසන් පේළිය සම්පූර්ණද? (හොඳ තත්වයක් නොවේ)

නමුත් අපි සෑම විටම අවසාන පේළිය අවසන් කරන්නේ නම්, එවිට අපි දැන ගන්නෙමු (අවසාන පේළිය අවසන් වී ඇත්දැයි පරීක්ෂා කරන්න). එසේ නොවුවහොත් අපට ආරක්ෂිතව සිටීම සඳහා සෑම විටම අවසාන පේළිය බැහැර කිරීමට සිදුවනු ඇත.


10

සමහර විග්‍රහ කිරීමේ කේතයන් එය පවතිනු ඇතැයි අපේක්ෂා කළ බවක් පෙනෙන්නට තිබේ.

මම එය "රීතියක්" ලෙස සලකනු ඇතැයි මට විශ්වාස නැත, එය නිසැකවම මම ආගමික වශයෙන් පිළිපැදිය යුතු දෙයක් නොවේ. අන්තිම පේළියේ නව රේඛාවක් සමඟ හෝ නැතිව පෙළ (පේළි-පේළිය) (පේළි අවසානයෙහි ඕනෑම තේරීමක්) පෙළ විග්‍රහ කරන්නේ කෙසේදැයි බොහෝ සංවේදී කේත දැන ගනු ඇත.

ඇත්ත වශයෙන්ම - ඔබ නව රේඛාවකින් අවසන් කරන්නේ නම්: (න්‍යායිකව) EOL සහ EOF අතර හිස් අවසාන රේඛාවක් තිබේද? මෙනෙහි කිරීමට එකක් ...


12
එය සමුළුවකදී, මෙය, නීතියක් ද නොවේ: එය රේඛාව සමග අවසන් වේ දෙයක් වන රේඛාව අවසන් . එබැවින් නැත, EOL සහ EOF අතර "හිස් අවසාන රේඛාවක්" නොමැත.
MestreLion

4
EstMestreLion: නමුත් ප්‍රශ්නයේ ඇති චරිතය "පේළියේ අවසානය" ලෙස නම් කර නැත, එය "නව රේඛාව" සහ / හෝ "රේඛීය සංග්‍රහය" ලෙස නම් කර ඇත. රේඛා බෙදුම්කරුවෙකු මිස රේඛීය පර්යන්තයක් නොවේ. ප්‍රති result ලය අවසාන හිස් රේඛාවකි.
බෙන් වොයිග්ට්

2
කිසිදු (sane) මෙවලමක් ගොනුවක අවසාන EOL (CR, LF, ආදිය) අතිරේක හිස් රේඛාවක් ලෙස ගණන් නොගනී. අවසන් වන EOL නොමැති නම් සියලුම POSIX මෙවලම් ගොනුවක අවසාන අක්ෂර රේඛාවක් ලෙස ගණන් නොගනී. කුමක් EOL චරිත නම "රේඛාව පෝෂණය" හෝ "carriage return" ( "නව පේළියකට යොමු කිරීමේ අක්ෂරය" නම් කිසිදු චරිතය තියෙනවා) වීම, සියලු ම ප්රායෝගික puposes සඳහා සංවේදී මෙවලම් එය රේඛාවක් ලෙස සලකන ටර්මිනේටර් නොව රේඛාවක් ලෙස වෙන්කර .
MestreLion

2
EstMestreLion, "රේඛීය ටර්මිනේටරය" හොඳ යැයි ඔබට විශ්වාසද? ක්‍රමලේඛකයින් නොවන කිහිප දෙනෙකු අල්ලා ඉක්මන් සමීක්ෂණයක් කරන්න. රේඛා සංකල්පය "රේඛා බෙදුම්කරුවන්" සංකල්පයට සමීප බව ඔබට ඉක්මනින් වැටහෙනු ඇත. "රේඛීය ටර්මිනේටර්" සංකල්පය අමුතුයි .
පැසීරියර්

4
Ah සාහුජින්: මෙය මගේ මතය නොවේ, පොසික්ස් ප්‍රමිතිය රේඛාවක් අර්ථ දක්වන්නේ එලෙසයි. බයිට් 0 ක් සමග හිස් ගොනුවක් ආයාමයේ EOL, සහ පමණක් තනි, හිස් මාර්ගය සහිත ලෙස සැලකිය කිරීමට ගොනුවක්, එය, 0 රේඛා ඇති කරන්නේ ඉතා EOL අවශ්ය වේ. මෙය අදාළ වන්නේ ඔබට ගොනුවක පේළි ගණන් කිරීමට අවශ්‍ය නම් පමණක් බව පැහැදිලිය. පැහැදිලිවම ඕනෑම සංස්කාරකයෙක් ඔබට දැනටමත් ඊඕඑල් එකක් තිබේ නම් නොසලකා ඊළඟ (හෝ පළමු) පේළියට "යාමට" ඉඩ දෙනු ඇත.
MestreLion

10

අවසානයේ නව රේඛා නොමැති ලිපිගොනු සමඟ ප්‍රායෝගික ක්‍රමලේඛන ගැටළුවක් ද ඇත: readබාෂ් බිල්ට් (වෙනත් readක්‍රියාත්මක කිරීම් ගැන මම නොදනිමි ) අපේක්ෂා කළ පරිදි ක්‍රියා නොකරයි:

printf $'foo\nbar' | while read line
do
    echo $line
done

මෙය මුද්‍රණය කිරීම පමණිfoo ! හේතුව read, අවසාන පේළිය හමු වූ විට , එය අන්තර්ගතය ලියන $lineනමුත් පිටවීමේ කේතය 1 වෙත ආපසු එන්නේ එය EOF වෙත ළඟා වූ බැවිනි. මෙය whileලූපය බිඳ දමයි , එබැවින් අපි කිසි විටෙකත් echo $lineකොටස වෙත ළඟා නොවෙමු . ඔබට මෙම තත්වය පාලනය කිරීමට අවශ්‍ය නම්, ඔබ පහත සඳහන් දෑ කළ යුතුය.

while read line || [ -n "${line-}" ]
do
    echo $line
done < <(printf $'foo\nbar')

එනම්, ගොනුව අවසානයේ හිස් නොවන රේඛාවක් නිසා අසමත් echoවුවහොත් readකරන්න. ස්වාභාවිකවම, මෙම අවස්ථාවේ දී ආදානයේ නොතිබූ නිමැවුමේ එක් අතිරේක නව රේඛාවක් ඇත.


9

(පෙළ) ලිපිගොනු නව රේඛාවකින් අවසන් විය යුත්තේ ඇයි?

බොහෝ අය විසින් ප්‍රකාශිත පරිදි, මන්ද:

  1. බොහෝ වැඩසටහන් හොඳින් හැසිරෙන්නේ නැත, නැතහොත් එය නොමැතිව අසමත් වේ.

  2. ගොනුවක් හොඳින් හසුරුවන වැඩසටහන් පවා අවසානයක් නොමැති වුවද '\n', මෙවලමෙහි ක්‍රියාකාරීත්වය පරිශීලකයාගේ අපේක්ෂාවන් සපුරාලන්නේ නැත - මෙම කෙළවරේ දී අපැහැදිලි විය හැකිය.

  3. වැඩසටහන් කලාතුරකින් අවසාන දේට ඉඩ'\n' නොදේ (මම කිසිවක් නොදනිමි).


එහෙත් මෙය ඊළඟ ප්‍රශ්නය අසයි:

නව රේඛාවක් නොමැතිව පෙළ ලිපිගොනු සම්බන්ධයෙන් කේත කළ යුත්තේ කුමක්ද?

  1. වැදගත්ම දේ - පෙළ ගොනුවක් නව රේඛාවකින් අවසන් වන බව උපකල්පනය කරන කේතයක් ලියන්න එපා . ගොනුවක් ආකෘතියකට අනුකූල යැයි උපකල්පනය කිරීම දත්ත දූෂණය, හැකර් ප්‍රහාර සහ බිඳ වැටීම් වලට තුඩු දෙයි. උදාහරණයක්:

    // Bad code
    while (fgets(buf, sizeof buf, instream)) {
      // What happens if there is no \n, buf[] is truncated leading to who knows what
      buf[strlen(buf) - 1] = '\0';  // attempt to rid trailing \n
      ...
    }
    
  2. අවසාන ලුහුබැඳීම '\n'අවශ්‍ය නම්, එය නොමැතිවීම සහ ගනු ලබන ක්‍රියාමාර්ගය පිළිබඳව පරිශීලකයා දැනුවත් කරන්න. IOWs, ගොනුවේ ආකෘතිය වලංගු කරන්න. සටහන: මෙයට උපරිම පේළි දිග, අක්ෂර කේතන ක්‍රම ආදිය සඳහා සීමාවක් ඇතුළත් විය හැකිය.

  3. අතුරුදහන් වූ අවසාන කොටස කේතය හැසිරවීම පැහැදිලිව නිර්වචනය කරන්න '\n'.

  4. හැකි තරම්, ගොනුවක් උත්පාදනය නොකරන්න '\n'.


5

මෙහි ඉතා ප්‍රමාද නමුත් ලිපිගොනු සැකසීමේ එක් දෝෂයකට මා මුහුණ දුන් අතර එය පැමිණියේ ලිපිගොනු හිස් නව රේඛාවකින් අවසන් නොවන බැවිනි. අපි sedසහ සමඟ පෙළ ලිපිගොනු සකස් කරමින් සිටියෙමුsed අවලංගු json ව්යුහය සිදු කරමින් හා රාජ්ය අසාර්ථක වීමට ක්රියාවලිය සෙසු යැවීම කළ ප්රතිදානය සිට පසුගිය මාර්ගය සැර බාල කරන ලදී.

අපි කරමින් සිටියේ:

එක් සාම්පල ගොනුවක් ඇත: foo.txtඑහි යම් jsonඅන්තර්ගතයක් ඇත.

[{
    someProp: value
},
{
    someProp: value
}] <-- No newline here

ගොනුව වැන්දඹුවන්ගේ යන්ත්‍රයෙන් නිර්මාණය කර ඇති අතර කවුළු ස්ක්‍රිප්ට් එම ගොනුව පවර්ෂෙල් විධාන භාවිතයෙන් සැකසෙමින් පවතී. සියල්ල හොඳයි.

අපි sedවිධාන භාවිතා කරමින් එකම ගොනුවක් සැකසූ විටsed 's|value|newValue|g' foo.txt > foo.txt.tmp

අලුතින් ජනනය කරන ලද ගොනුව විය

[{
    someProp: value
},
{
    someProp: value

සහ උත්පාතය, අවලංගු JSON නිසා එය අනෙක් ක්‍රියාවලි අසාර්ථක විය.

එබැවින් ඔබගේ ගොනුව හිස් නව පේළියකින් අවසන් කිරීම සැමවිටම හොඳ පුරුද්දකි.


3

නව රේඛාවක් නොමැතිව ගොනුවක් විග්‍රහ කිරීම දුෂ්කර වූ දිනවල සිට රීතිය පැමිණි බව මම නිතරම සිතුවෙමි. එනම්, ඔබ ලිවීමේ කේතය අවසන් කරනුයේ රේඛාවේ අවසානය EOL අක්ෂරයෙන් හෝ EOF මගින් අර්ථ දක්වා ඇති බැවිනි. රේඛාවක් EOL සමඟ අවසන් යැයි උපකල්පනය කිරීම සරල ය.

කෙසේ වෙතත්, නව රේඛාව අවශ්‍ය වන සී සම්පාදකයින්ගෙන් රීතිය ව්‍යුත්පන්න වී ඇතැයි මම විශ්වාස කරමි. පෙන්වා දුන් පරිදි සම්පාදක අනතුරු ඇඟවීමක් "ගොනුව අවසානයේ දී නොමැත නව පේළියකට යොමු කිරීමේ අක්ෂරය" , #include වූ නව පේළියකට යොමු කිරීමේ අක්ෂරය එකතු කිරීමට නොහැකි වනු ඇත.


0

වෙනත් ක්‍රියාවලියක් මඟින් ගොනුව ජනනය කරන අතරතුර ගොනුව සැකසෙමින් පවතින බව සිතන්න.

එයට ඒ හා සම්බන්ධ විය හැකිද? ගොනුව සැකසීමට සූදානම් බව දැක්වෙන ධජයක්.


-4

ප්‍රභව කේත ලිපිගොනු අවසානයේ මම පෞද්ගලිකව නව රේඛාවලට කැමතියි.

එහි මූලාරම්භය ලිනක්ස් හෝ ඒ සඳහා සියලු යුනික්ස් පද්ධති සමඟ තිබිය හැකිය. මූලාශ්‍ර කේත ලිපිගොනු හිස් නව පේළියකින් අවසන් නොවූ නිසා සම්පාදක දෝෂ (gcc මා වරදවා වටහා නොගත්තොත්) මට මතකයි. ඇයි මේ විදියට හැදුවේ කියලා පුදුම වෙන්න පුළුවන්.


-6

IMHO, එය පෞද්ගලික ශෛලිය හා මතය පිළිබඳ කාරණයකි.

පැරණි දිනවලදී, මම එම නව රේඛාව තැබුවේ නැත. සුරකින ලද අක්ෂරයක් යනු එම 14.4K මොඩමය හරහා වැඩි වේගයක් ලබා ගැනීමයි.

පසුව, මම එම නව රේඛාව තැබුවෙමි.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.