Bazı sistemlerde truncate
dosyaları birkaç bayta (karakterlere değil) kesen bir komut bulunur .
perl
Çoğu sistemde varsayılan olarak yüklenen çare olabilir, ancak bir dizi karakter için kesilen herhangi bir bilmiyorum :
perl
perl -Mopen=locale -ne '
BEGIN{$/ = \1234} truncate STDIN, tell STDIN; last' <> "$file"
İle -Mopen=locale
, yerel ayarın hangi karakter olduğu fikrini kullanırız (UTF-8 karakter kümesini kullanan yerel ayarlarda UTF-8 kodlu karakterler kullanılır). -CS
Yerel ayarın karakter kümesine bakılmaksızın G / Ç'nin UTF-8'de kodunun çözülmesini / kodlanmasını istiyorsanız değiştirin .
$/ = \1234
: kayıt ayırıcısını, sabit uzunluktaki ( karakter sayısı olarak ) kayıtları belirtmenin bir yolu olan bir tam sayı referansına ayarladık .
daha sonra ilk kaydı okuduktan sonra, stdin'i yerinde keseriz (böylece ilk kaydın sonunda) ve çıkarız.
GNU sed
GNU sed
ile şunları yapabilirsiniz (dosyanın NUL karakterleri veya geçerli karakterler oluşturmayan bayt dizileri içermediği varsayılarak - her ikisi de metin dosyaları için geçerli olmalıdır):
sed -Ez -i -- 's/^(.{1234}).*/\1/' "$file"
Ancak bu, dosyayı tam olarak okuduğu ve hafızasında sakladığı ve yeni bir kopya yazdığı için çok daha az verimlidir.
GNU awk
GNU ile aynı awk
:
awk -i inplace -v RS='^$' -e '{printf "%s", substr($0, 1, 1234)}' -E /dev/null "$file"
-e code -E /dev/null "$file"
rasgele dosya adlarını iletmenin bir yolu olmak gawk
RS='^$'
: slurp modu .
Kabuk yapıları
İle ksh93
, bash
ya da zsh
(dışındaki kabuklarla zsh
NUL içermeyen içeriği varsayarak bayt):
content=$(cat < "$file" && echo .) &&
content=${content%.} &&
printf %s "${content:0:1234}" > "$file"
İle zsh
:
read -k1234 -u0 s < $file &&
printf %s $s > $file
Veya:
zmodload zsh/mapfile
mapfile[$file]=${mapfile[$file][1,1234]}
İle ksh93
ya da bash
(dikkat çeşitli sürümleri çoklu bayt karakterler için 's Bogusbash
):
IFS= read -rN1234 s < "$file" &&
printf %s "$s" > "$file"
ksh93
ayrıca dosyayı yeniden <>;
yönlendirme işleciyle yeniden yazmak yerine kısaltabilir :
IFS= read -rN1234 0<>; "$file"
iconv + kafa
To yazdırmak ilk 1234 karakter, başka bir seçenek gibi karakterin başına bayt sabit sayıda bir kodlama dönüştürmek olabilir UTF32BE
/ UCS-4
:
iconv -t UCS-4 < "$file" | head -c "$((1234 * 4))" | iconv -f UCS-4
head -c
standart değildir, ancak oldukça yaygındır. Standart bir eşdeğer dd bs=1 count="$((1234 * 4))"
, girdiyi okuyacağı ve çıktıyı her seferinde bir bayt yazacağı için daha az etkili olacaktır, ancak daha az verimli olacaktır. iconv
standart bir komuttur ancak kodlama adları standartlaştırılmamıştır, bu nedenleUCS-4
notlar
Her durumda, çıktının en fazla 1234 karakteri olmasına rağmen, muhtemelen sınırlandırılmamış bir satırla biteceğinden geçerli metin olmayabilir.
Ayrıca, bu çözümler bir karakterin ortasında metin kesmezken , é
U + 0065 U + 0301 ( e
ardından bir akut aksanı birleştiren) gibi ifade edilen bir grafiğin ortasında onu kırabileceklerini , veya Hangul heceli grafemleri ayrıştırılmış formlarında.
¹ ve boru girişinde bs
, iflag=fullblock
GNU uzantısını kullanmadığınız sürece 1'den farklı değerleri güvenilir şekilde kullanamazsınız , çünkü dd
boruyu iconv
doldurmaktan daha hızlı okursa kısa okumalar yapabilir
cut
hala çok baytlı karakterleri desteklemediğini unutmayın. Eğer öyleyse, yapabilirdincut -zc-1234 | tr -d '\0'
.