कुछ सिस्टम में एक truncateकमांड होती है जो फाइलों को कई बाइट्स में ले जाती है (अक्षर नहीं)।
मुझे किसी भी वर्ण का पता नहीं है जो कई वर्णों को काटता है, हालाँकि आप इसका सहारा ले सकते हैं perlजो कि अधिकांश प्रणालियों पर डिफ़ॉल्ट रूप से स्थापित है:
पर्ल
perl -Mopen=locale -ne '
BEGIN{$/ = \1234} truncate STDIN, tell STDIN; last' <> "$file"
इसके साथ -Mopen=locale, हम लोकेल की धारणा का उपयोग करते हैं कि कौन से वर्ण हैं (इसलिए UTF-8 वर्णमाला का उपयोग करने वाले स्थानों में, वह UTF-8 एन्कोडेड वर्ण हैं)। -CSयदि आप चाहते हैं कि मैं / O को यूटीएफ -8 में डीकोड / एनकोडेड किया जाए, तो लोकेल के चारसेट की परवाह किए बिना बदलें ।
$/ = \1234: हम रिकॉर्ड विभाजक को एक पूर्णांक के संदर्भ में सेट करते हैं जो निश्चित लंबाई ( वर्णों की संख्या ) में रिकॉर्ड निर्दिष्ट करने का एक तरीका है ।
तब पहला रिकॉर्ड पढ़ने के बाद, हम जगह में स्टड को अलग कर देते हैं (इसलिए पहले रिकॉर्ड के अंत में) और बाहर निकलें।
GNU sed
GNU के साथ sed, आप ऐसा कर सकते हैं (यह मानते हुए कि फ़ाइल में NUL वर्ण या बाइट्स के अनुक्रम नहीं हैं जो वैध वर्ण नहीं बनाते हैं - दोनों को पाठ फ़ाइलों का सच होना चाहिए):
sed -Ez -i -- 's/^(.{1234}).*/\1/' "$file"
लेकिन यह बहुत कम कुशल है, क्योंकि यह फ़ाइल को पूर्ण रूप से पढ़ता है और इसे पूरी मेमोरी में संग्रहीत करता है, और एक नई प्रतिलिपि लिखता है।
जीएनयू जागा
GNU के साथ भी awk:
awk -i inplace -v RS='^$' -e '{printf "%s", substr($0, 1, 1234)}' -E /dev/null "$file"
-e code -E /dev/null "$file" एक तरह से मनमानी फ़ाइल नामों को पारित करने के लिए किया जा रहा है 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या इसके कई संस्करणों में बहु-बाइट वर्णों के लिए फर्जी है ) के साथ:bashbash
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))"लेकिन कम कुशल होगा, क्योंकि यह इनपुट को पढ़ेगा और आउटपुट को एक बार में एक बाइट लिख देगा। iconvएक मानक कमांड है, लेकिन एन्कोडिंग नाम मानकीकृत नहीं हैं, इसलिए आप सिस्टम को बिना खोज सकते हैंUCS-4
टिप्पणियाँ
किसी भी मामले में, हालांकि आउटपुट में अधिकतम 1234 अक्षर होंगे, यह अंत में मान्य पाठ नहीं हो सकता है, क्योंकि यह संभवतः एक गैर-सीमांकित रेखा में समाप्त होगा।
यह भी ध्यान दें कि जब वे समाधान किसी पात्र के बीच में पाठ को नहीं काटेंगे, तो वे इसे ग्रैफेम के बीच में तोड़ सकते हैं , जैसे éकि यू + 0065 यू + 0301 (एक eतीव्र उच्चारण के संयोजन के बाद) के रूप में व्यक्त किया जाता है, या हंगुल शब्दांश अंगूर अपने विघटित रूपों में।
¹ और पाइप इनपुट पर आप उपयोग नहीं कर सकते bs1 मज़बूती के अतिरिक्त अन्य मान जब तक आप का उपयोग iflag=fullblock, जीएनयू विस्तार के रूप में ddकम पढ़ता है अगर यह पाइप तेज पढ़ता से कर सकता है iconvभरण यह
cutअभी भी मल्टी-बाइट वर्णों का समर्थन नहीं करता है। अगर ऐसा होता, तो आप कर सकते थेcut -zc-1234 | tr -d '\0'।