Strona 1 z 1

[+] Bash, dopisanie znaku na początku linii zawierającej ciąg znaków

: 29 czerwca 2011, 11:51
autor: LordRuthwen
W jaki sposób można dopisać znak # na początku linii zawierającej zadaną frazę?
Dopisanie # na poczśtku każdej linii nie jest trudne, bo wystarczy coś takiego:

Kod: Zaznacz cały

sed 's/^/#/g'
natomiast mnie interesują tylko te linie, które zawierają ciągi znaków zawartych w pliku, niech będzie /home/lista
Teraz pytanie jak to można rozwiązać?
Próbowałem ten sposób:

Kod: Zaznacz cały

exec 3<&0
exec 0</home/lista
while read line
do
grep $line plik | sed 's/^/#/g'
done
exec 0<&3
Ale efekt jest oczywisty i nie działa jak trzeba.

Dodane:
Doszedłem do czegoś takiego:

Kod: Zaznacz cały

#!/bin/bash
exec 3<&0
exec 0</home/lista
while read line
do
a=`grep $line /etc/arp/oki2 |tail -n 1 | sed 's/^/#/g'`
echo "A: " $a
echo "line: " $line
sed -i "s/$line/$a/g" /etc/arp/oki2
done
exec 0<&3
ale coś tam dalej nie działa, plik lista:

Kod: Zaznacz cały

kot
ala
plik przed edycja:

Kod: Zaznacz cały

ala ma kota
kot to nie pies
kot ma ale
ala to baba
ale tu nie ma nic
plik po edycji:

Kod: Zaznacz cały

#ala to baba ma #kot ma alea
#kot ma ale to nie pies
#kot ma ale ma ale
#ala to baba to baba
ale tu nie ma nic

: 29 czerwca 2011, 14:18
autor: Bastian
A awku to bym to zrobił tak:

Kod: Zaznacz cały

awk '$0 != ""  { print "#"$0}'  plik

: 29 czerwca 2011, 14:28
autor: LordRuthwen
Zmajstrowałem coś takiego:

Kod: Zaznacz cały

#!/bin/bash
exec 3<&0
exec 0</home/lista
while read line
do
a=`grep "$line" /etc/arp/oki2 |wc -l`
for (( c=1; c<=$a; c++))
do
b=`grep $line /etc/arp/oki2 | head -n $c | tail -n 1`
d=`grep $line /etc/arp/oki2 | head -n $c | tail -n 1 | sed 's/^/#/g'`
sed -i "s/$b/$d/g" /etc/arp/oki2
done
done
exec 0<&3
Może dookoła, ale działa i robi to co ma robić :)

: 29 czerwca 2011, 18:42
autor: Bastian
Nawet bardzo dookoła, bo jesli Cię dobrze zrozumiałem to mój sposób załatwiłby sprawę.

: 30 czerwca 2011, 14:48
autor: LordRuthwen
Wyjaśnij mi proszę na jakiej zasadzie twoje rozwiązanie działa.