কিছু সিস্টেমে একটি truncate
কমান্ড থাকে যা ফাইলগুলি কয়েকটি বাইট (অক্ষর নয়) থেকে কেটে দেয় ।
আমি এমন কয়েকটি চরিত্রের সংক্ষিপ্ত বিবরণ সম্পর্কে জানি না, যদিও আপনি perl
বেশিরভাগ সিস্টেমে ডিফল্টরূপে ইনস্টল করা থাকতে পারেন:
Perl
perl -Mopen=locale -ne '
BEGIN{$/ = \1234} truncate STDIN, tell STDIN; last' <> "$file"
এর সাহায্যে -Mopen=locale
, আমরা অক্ষরগুলি কী কী তা লোকের ধারণাটি ব্যবহার করি (সুতরাং ইউটিএফ -8 চরসেট ব্যবহার করে লোকালগুলিতে, এটি ইউটিএফ -8 এনকোডেড অক্ষর)। -CS
আপনি যদি লোকেলের চরসেট নির্বিশেষে ইউটিএফ -8 এ আই / ওকে ডিকডড / এনকোড করতে চান তবে এর সাথে প্রতিস্থাপন করুন ।
$/ = \1234
: আমরা একটি পূর্ণসংখ্যা যা সংশোধন করা হয়েছে দৈর্ঘ্য রেকর্ড নির্দিষ্ট করার (সংখ্যা একটি উপায় একটি রেফারেন্স রেকর্ড বিভাজক সেট অক্ষর )।
তারপরে প্রথম রেকর্ডটি পড়ার পরে, আমরা স্টিডিনকে জায়গায় কাটা (সুতরাং প্রথম রেকর্ডের শেষে) এবং প্রস্থান করি।
জিএনইউ সেড
জিএনইউ দিয়ে sed
আপনি এটি করতে পারলেন (ধরে নিলেন যে ফাইলটিতে NUL টি অক্ষর বা বাইটের ক্রম নেই যা বৈধ অক্ষর তৈরি করে না - উভয়ই পাঠ্য ফাইলের ক্ষেত্রে সত্য হওয়া উচিত):
sed -Ez -i -- 's/^(.{1234}).*/\1/' "$file"
তবে এটি অনেক কম দক্ষ, কারণ এটি ফাইলটি পুরোপুরি পড়ে এবং এটি পুরো স্মৃতিতে সঞ্চয় করে এবং একটি নতুন অনুলিপি লেখেন।
জিএনইউ অবাক
জিএনইউর সাথে একই awk
:
awk -i inplace -v RS='^$' -e '{printf "%s", substr($0, 1, 1234)}' -E /dev/null "$file"
-e code -E /dev/null "$file"
যথেচ্ছ ফাইলের নামটি পাস করার এক উপায় one gawk
RS='^$'
: স্লুর্প মোড ।
শেল বিল্টিনস
সঙ্গে ksh93
, bash
বা zsh
(ব্যতীত অন্য শেল সঙ্গে zsh
, বিষয়বস্তু NUL ধারণ করে না অভিমানী বাইট):
content=$(cat < "$file" && echo .) &&
content=${content%.} &&
printf %s "${content:0:1234}" > "$file"
সহ zsh
:
read -k1234 -u0 s < $file &&
printf %s $s > $file
বা:
zmodload zsh/mapfile
mapfile[$file]=${mapfile[$file][1,1234]}
এর সাথে ( ksh93
বা এর বেশ কয়েকটি সংস্করণে বহু-বাইট অক্ষরের জন্য এটি বোগাসbash
সাবধান ):bash
IFS= read -rN1234 s < "$file" &&
printf %s "$s" > "$file"
ksh93
এটির <>;
পুনঃনির্দেশ অপারেটরের মাধ্যমে পুনরায় লেখার পরিবর্তে ফাইলটি জায়গায় ছাঁটাই করতে পারে :
IFS= read -rN1234 0<>; "$file"
আইকনভি + মাথা
করার প্রিন্ট প্রথম 1234 অক্ষর, অন্য কোনো বিকল্প মত চরিত্র প্রতি বাইটের একটি নির্দিষ্ট সংখ্যা দিয়ে এনকোডিং রূপান্তর হতে পারে UTF32BE
/ UCS-4
:
iconv -t UCS-4 < "$file" | head -c "$((1234 * 4))" | iconv -f UCS-4
head -c
মানক নয়, তবে মোটামুটি সাধারণ। একটি স্ট্যান্ডার্ড সমতুল্য হবে dd bs=1 count="$((1234 * 4))"
তবে কম দক্ষ হবে, কারণ এটি ইনপুট পড়বে এবং আউটপুট এক সময়ে লিখবে write iconv
একটি স্ট্যান্ডার্ড কমান্ড তবে এনকোডিংয়ের নামগুলি প্রমিত করা হয় না, সুতরাং আপনি সিস্টেমগুলি ছাড়াই খুঁজে পেতে পারেনUCS-4
মন্তব্য
যাইহোক, আউটপুটে সর্বাধিক 1234 অক্ষর থাকলেও এটি বৈধ পাঠ্য না হয়ে শেষ হতে পারে, কারণ এটি সম্ভবত একটি সীমানা ছাড়ানো লাইনে শেষ হবে।
আরও মনে রাখবেন যে যখন এই সমাধানগুলি কোনও চরিত্রের মাঝখানে পাঠ্য কেটে না দেয় তবে তারা এটি গ্রাফিমের মাঝখানে ভেঙে ফেলতে পারে , é
যেমন ইউ + 0065 ইউ + 0301 হিসাবে প্রকাশিত হয়েছিল (এর e
পরে সংশ্লেষিত তীব্র উচ্চারণটি হবে), বা তাদের ক্ষয় ফর্মগুলিতে হাঙ্গুলের সিলেবল গ্রাফিগুলি।
Pipe এবং পাইপ ইনপুটটিতে আপনি জিএনইউ এক্সটেনশনটি bs
ব্যবহার না করে নির্ভরযোগ্যতার সাথে 1 টির চেয়ে অন্য মানগুলি ব্যবহার করতে পারবেন না , পাইপটি পূরণ করার চেয়ে দ্রুত পড়লে তা সংক্ষিপ্ত পড়তে পারেiflag=fullblock
dd
iconv
cut
এখনও মাল্টি-বাইট অক্ষরকে সমর্থন করে না। যদি এটি হয়, আপনি করতে পারেনcut -zc-1234 | tr -d '\0'
।