2012-11-27 11 views
13

Mam następujący kod, który bash pętle poprzez pliku tekstowym, linia po linii .. im próbuje poprzedzić prefiksem „praca” na każdej linii, ale zamiast tego dostaję ten błąd:Jak mogę przedłużyć ciąg znaków do początku każdej linii w pliku?

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

jest to bash skrypt ..

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

Co ja tu robię źle?

Aktualizacja: Wykonanie głowy na pliku zrzuca wszystkie linie do pojedynczej linii terminalu, prawdopodobnie powiązane?

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

Prawdopodobnie masz nieprawidłowych zakończeń linii w pliku. Być może chcesz 'dos2unix' –

+0

@WilliamPursell próbowałem uruchomić dos2unix do pliku, ale nie wstawiłem dla mnie nowych linii, najłatwiejszym rozwiązaniem było skopiowanie zawartości pliku do nowego pliku – bobbyrne01

Odpowiedz

28

polecenia awk jedna linia powinna załatwić sprawę także:

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

tak prosty, uwielbiam to! Właśnie przekierowałem te polecenia do pliku. Dzięki! – bobbyrne01

3

Zamiast pętli for, jest bardziej odpowiedni do korzystania while read...:

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

Ale można byłoby znacznie lepiej z prostszej:

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

pierwszy blok kodu nie zaktualizował pliku z nowymi prefiksami a drugi blok tylko zaktualizował pierwszą linię pliku – bobbyrne01

3

Perl drodze do zrób to:

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

lub

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

W każdym przypadku, który odczytuje z filename i drukuje prefiksem linie na standardowe wyjście.

Po dodaniu flagi -i, Perl zmodyfikuje plik na miejscu. Możesz także podać wiele nazw plików, a Perl zrobi to w magiczny sposób.

0

Nie potrzeba sed, po prostu złączyć sznurki w poleceniu echo

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

swoje iteracje pętli nad każdym słowo w pliku:

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

chodzi y nasz oryginalny błąd:

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

Problem jest z tej linii kodu:

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

$ linia w tym kontekście jest nazwa plik że sed działa przeciw. Aby poprawić swój kod należy naprawić tę linię jako takie:

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

(również pamiętać, że oryginalny kod nie powinien mieć < $file na końcu.)

William Pursell rozwiązuje ten problem poprawnie w obu swoich sugestiach.

Uważam jednak, że prawidłowo zidentyfikowałeś problem związany z oryginalnym plikiem tekstowym. dos2unix nie rozwiąże problemu, ponieważ powoduje jedynie usunięcie znaków końca karetki. (Jeśli jednak spróbujesz odczytać plik Linux w systemie Windows, otrzymasz gigantyczną linię bez zwracanych danych).

Zakładając, że nie jest to problem z końcowymi znakami linii w pliku tekstowym, William Pursell's Odpowiedzi Andy'ego Lestera lub zerowej rewolucji będą działać.

wariacja na temat while read... sugestia:

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

ten można uruchomić bezpośrednio z powłoki (nie ma potrzeby pliku wsadowego/script):

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

+1

1) wyłącz dzielenie pól, aby nie usuwać pustych pól wiodących i znaków szlaku oraz 2) podawać swoje zmienne z wielu powodów: 'while IFS = read -r line; do echo "kp" "$ line"; done

6

całego Pętlę można zastąpić pojedynczym poleceniem sed działającym na całym pliku:

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

Czy można również sprawdzić, czy linia jest pusta, czy nie? –

+0

Czy chcesz zostawić puste linie puste? – Jack

+1

To było tak dawno ... Nive byłoby wiedzieć, obie opcje –

0

Użyj sed. Po prostu zmień słowo prefix.

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

Jeżeli chcesz zapisać wynik w innym pliku

sed -e 's/^/prefix/' file.ext > file_new.ext 
Powiązane problemy