2012-11-27 15 views
13

मैं निम्नलिखित बैश कोड है जो एक पाठ फ़ाइल के माध्यम से लूप होता है, लाइन द्वारा लाइन .. im प्रत्येक पंक्ति के लिए काम 'उपसर्ग' उपसर्ग की कोशिश कर रहा, लेकिन इसके बजाय इस त्रुटि हो रही है है:मैं फ़ाइल में प्रत्येक पंक्ति की शुरुआत में एक स्ट्रिंग कैसे प्रीपेड कर सकता हूं?

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

यह बैश है लिपि ..

#!/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 

मैं यहां क्या गलत कर रहा हूं?

अद्यतन: फाइल पर सिर का प्रदर्शन टर्मिनल की एक पंक्ति पर सभी लाइनों को डंप करता है, शायद संबंधित है?

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

में उत्पादन को बचाने के लिए चाहते हैं, तो आप शायद फ़ाइल में अमान्य पंक्ति अंत है। शायद आप चाहते हैं कि 'dos2unix' –

+0

@WilliamPursell मैंने फ़ाइल के खिलाफ dos2unix चलाने की कोशिश की लेकिन मेरे लिए नई लाइनें नहीं डालीं, सबसे आसान समाधान फ़ाइल फ़ाइल को एक नई फ़ाइल में कॉपी किया गया था – bobbyrne01

उत्तर

28

एक पंक्ति awk आदेश चाल भी करना चाहिए:

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

फ़ाइल की पहली पंक्ति को अपडेट किया, इतना आसान, इसे प्यार करो! मैंने बस इस कमांड आउटपुट को फाइल में रीडायरेक्ट किया .. धन्यवाद! – bobbyrne01

3
पाश के लिए करने के बजाय

, यह अधिक while read... उपयोग करने के लिए उचित है:

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

लेकिन तुम बहुत सरल के साथ बंद बेहतर होगा:

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

पहला कोड ब्लॉक नए उपसर्गों के साथ फ़ाइल को अपडेट नहीं किया था और दूसरे ब्लॉक ने केवल – bobbyrne01

3

एक पर्ल तरीका यह होगा:

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

या

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

या तो मामले, कि filename से पढ़ता है और STDOUT करने के लिए पहले से जुड़ा हुआ लाइनों प्रिंट में।

यदि आप -i ध्वज जोड़ते हैं, तो पर्ल फ़ाइल को जगह में संशोधित करेगा। आप कई फ़ाइल नाम भी निर्दिष्ट कर सकते हैं और पर्ल जादूगर रूप से उन सभी को कर देगा।

0

आप एसईडी की जरूरत नहीं है, बस प्रत्येक पर

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

आपका पाश दोहराता गूंज आदेश में तार जोड़ फ़ाइल में शब्द:

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

के संबंध में y हमारे मूल त्रुटि:

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

समस्या कोड की इस पंक्ति के साथ है: इस संदर्भ में

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

$ लाइनफ़ाइल नाम कि sed के खिलाफ चल रहा है है। अपने कोड को ठीक करने के आप इस तरह के रूप में इस लाइन को ठीक करना चाहिए:

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

(भी ध्यान रखें कि अपने मूल कोड अंत में < $file नहीं होना चाहिए।)

विलियम पर्सेल इस मुद्दे को उनके दोनों सुझावों में सही ढंग से संबोधित करते हैं।

हालांकि, मेरा मानना ​​है कि आपने सही ढंग से पहचाना है कि आपकी मूल टेक्स्ट फ़ाइल में कोई समस्या है। dos2unix इस समस्या को ठीक नहीं करेगा, क्योंकि यह केवल कैरिज रिटर्न को स्ट्रिप्स करता है विंडोज़ लाइनों के अंत में चिपक जाती है। (हालांकि, यदि आप विंडोज़ में लिनक्स फ़ाइल को पढ़ने का प्रयास कर रहे हैं, तो आपको कोई रिटर्न नहीं मिलेगा।)

मान लीजिए कि यह आपकी टेक्स्ट फ़ाइल में लाइन वर्णों के अंत में कोई समस्या नहीं है, विलियम पर्सेल , एंडी लेस्टर, या nullrevolution के जवाब काम करेंगे।

while read... सुझाव पर एक बदलाव:

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

+1

1) फील्ड विभाजन को बंद करें ताकि आप अग्रणी और ट्रेलिन रिक्त स्थान न पड़े, और 2) कई कारणों से अपने चर उद्धरण दें: 'जबकि IFS = read -r लाइन; echo "kp" "$ line" करें; किया

6

पूरे:

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

यह खोल (एक बैच/स्क्रिप्ट फ़ाइल के लिए कोई ज़रूरत नहीं) से सीधे चलाया जा सकता है लूप को एक एकल sed कमांड द्वारा प्रतिस्थापित किया जा सकता है जो पूरी फ़ाइल पर चल रहा है:

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

क्या गीली जांचना भी संभव है कि रेखा खाली है या नहीं? –

+0

क्या आप खाली लाइन खाली छोड़ना चाहते हैं? – Jack

+1

यह बहुत समय पहले है ... दोनों विकल्पों को जानने के लिए यह जानना होगा –

0

sed का उपयोग करें। बस prefix शब्द बदलें।

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

यदि आप किसी अन्य फाइल

sed -e 's/^/prefix/' file.ext > file_new.ext 
संबंधित मुद्दे

 संबंधित मुद्दे