कुछ सिस्टम में एक 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
या इसके कई संस्करणों में बहु-बाइट वर्णों के लिए फर्जी है ) के साथ: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))"
लेकिन कम कुशल होगा, क्योंकि यह इनपुट को पढ़ेगा और आउटपुट को एक बार में एक बाइट लिख देगा। iconv
एक मानक कमांड है, लेकिन एन्कोडिंग नाम मानकीकृत नहीं हैं, इसलिए आप सिस्टम को बिना खोज सकते हैंUCS-4
टिप्पणियाँ
किसी भी मामले में, हालांकि आउटपुट में अधिकतम 1234 अक्षर होंगे, यह अंत में मान्य पाठ नहीं हो सकता है, क्योंकि यह संभवतः एक गैर-सीमांकित रेखा में समाप्त होगा।
यह भी ध्यान दें कि जब वे समाधान किसी पात्र के बीच में पाठ को नहीं काटेंगे, तो वे इसे ग्रैफेम के बीच में तोड़ सकते हैं , जैसे é
कि यू + 0065 यू + 0301 (एक e
तीव्र उच्चारण के संयोजन के बाद) के रूप में व्यक्त किया जाता है, या हंगुल शब्दांश अंगूर अपने विघटित रूपों में।
¹ और पाइप इनपुट पर आप उपयोग नहीं कर सकते bs
1 मज़बूती के अतिरिक्त अन्य मान जब तक आप का उपयोग iflag=fullblock
, जीएनयू विस्तार के रूप में dd
कम पढ़ता है अगर यह पाइप तेज पढ़ता से कर सकता है iconv
भरण यह
cut
अभी भी मल्टी-बाइट वर्णों का समर्थन नहीं करता है। अगर ऐसा होता, तो आप कर सकते थेcut -zc-1234 | tr -d '\0'
।