2012-11-27 20 views
13

Bir metin dosyası aracılığıyla döngüler aşağıdaki bash kodu, satır satır .. im her bir satırın iş 'öneki' öneki çalışıyor ama onun yerine bu hatayı alıyorum vardır: Bu bashNasıl bir dosyadaki her satırın başına bir dize getirebilirsiniz ki?

[email protected]:~/Desktop$ ./appendToFile.sh stusers.txt kp 
stusers.txt 
kp 
./appendToFile.sh: line 11: /bin/sed: Argument list too long 
[email protected],passw0rd 

olduğunu betik ..

#!/bin/bash 

file=$1 
string=$2 

echo "$file" 
echo "$string" 

for line in `cat $file` 
do 
    sed -e 's/^/prefix/' $line 
    echo "$line" 
done < $file 

Burada yanlış olan ne yapıyorum?

Güncelleme: dosya üzerinde kafa Sahne terminalin tek bir satır üzerine tüm hatları, muhtemelen ilişkili döker? Bunun yerine döngü için

[email protected]:~/Desktop$ head stusers.txt 
[email protected]:~/Desktop$ ouse.com,passw0rd 
+2

yılında çıkışını kaydetmek istiyorsanız

sed -e 's/^/prefix/' file.ext 

Muhtemelen dosyasında geçersiz satır sonları var. Belki de dos2unix ' –

+0

@WilliamPursell dosyasını karşı dos2unix çalıştırmayı denedim ama benim için yeni satırları eklemedi, en kolay çözüm dosya içeriğini yeni önekleri ile güncelleştirmek için yeni bir dosya – bobbyrne01

cevap

28

:

awk '{print "prefix" $0}' file 
+1

dosyasının ilk satırını güncelledi, bu kadar basit! Bu komutları çıktı olarak bir dosyaya yönlendirdim .. Teşekkürler! – bobbyrne01

3

, while read... kullanmak daha uygundur:

while read -r line; do 
do 
    echo "$line" | sed -e 's/^/prefix/' 
done < $file 

Ama daha basit ile çok daha iyi olurdu:

sed -e 's/^/prefix/' $file 
+0

dosya içeriğini kopyalamak oldu ve ikinci blok sadece – bobbyrne01

3

A Perl yolu Bunu yapın:

perl -p -e's/^/prefix' filename 

veya filename okur ve çıkışı için önceden sabitlenmiş hatları yazdırır Her iki durumda,

perl -p -e'$_ = "prefix $_"' filename 

.

Bir -i bayrak eklerseniz, o zaman Perl yerinde dosyayı değiştirir. Ayrıca, birden çok dosya adlarını belirtebilir ve Perl sihirli hepsini yapacağız.

tek satırlık awk komutu da hile yapmak gerekir
0

Sadece her aşkın yankı komuta

while IFS= read -r line; do 
    echo "prefix$line" 
done < filename 

Kişisel döngü yineler dizeleri bitiştirmek, sed ihtiyacım yok dosyada kelime:

for line in `cat file`; ... 
9

ilgili y Bizim asıl hatası:

./appendToFile.sh: line 11: /bin/sed: Argument list too long

sorun bu kod satırı ile geçerli: bu bağlamda

sed -e 's/^/prefix/' $line

$ hattı karşı çalıştıran sed o dosya adıdır. Kodunuzu düzeltmek için aşağıdaki gibi bu hattı düzeltmek olmalıdır:

echo $line | sed -e 's/^/prefex/'

(Ayrıca orijinal kod sonunda < $file olmamalıdır unutmayın.

William Pursell bu sorunu her iki önerisinde de doğru olarak ele alıyor. Ancak, orijinal metin dosyanızda bir sorun olduğunu doğru bir şekilde belirlediğinize inanıyorum. dos2unix bu sorunu düzeltmez, çünkü yalnızca satırların sonlarına Windows taşıma çubuklarını döndürür. (Ancak, Windows'ta bir Linux dosyasını okuma girişiminde bulunursanız, geri dönüşü olmayan bir mamut satırı alırsınız.)

Metin dosyanızdaki satır sonu karakterleriyle ilgili bir sorun olmadığını varsayan William Pursell'in Andy Lester'ın ya da nullrevolution'un cevapları işe yarayacak.

while read... öneri bir varyasyonu:

while read -r line; do echo "kp" $line; done < stusers.txt

+1

1) alan ayırmayı kapatın, böylece lider ve iz boşluklarını kesmeyin, ve 2) değişkenlerinizi MANY nedenlerinden alıntılayın: 'IFS = read -r line; echo "kp" "$ line" yapın;

6

tüm: Bu kabuk (bir parti/komut dosyası için gerek) tarafından doğrudan çalıştırılabilir

while read -r line; do echo "PREFIX " $line; done < $file

döngü, tüm dosya üzerinde çalışan tek bir sed komutuyla değiştirilebilir:

sed -e 's/^/prefix/' $file 
+1

Hattın boş olup olmadığını kontrol etmek de mümkün mü? –

+0

Boş satırları boş bırakmak mı istiyorsun? – Jack

+1

Çok uzun zaman önce ... Her iki seçeneği de bilmek nif olurdu –

0

sed kullanın. Sadece prefix kelimesini değiştirin. Eğer başka bir dosya

sed -e 's/^/prefix/' file.ext > file_new.ext 
İlgili konular