Puncte:1

Trimiterea variabilelor de script bash către sed

drapel vn

afiș pentru prima dată aici și am căutat destul de mult timp, dar nu am găsit un fir pe care să-l înțeleg suficient de bine pentru a-mi rezolva problema.

Am o buclă în scriptul meu care generează anumite variabile prin delimitarea cut -d și vreau să folosesc acele variabile ca intrare pentru sed pentru a modifica un fișier în mod diferit la fiecare iterație. Scriptul meu actual este:

Scriptul meu actual arată astfel:

pentru intrare în $(tail -n 3 filea)
do
        a="$(echo $input | cut -d "," -f 1)"
        b="$(echo $input | cut -d "," -f 2)"
        c="$(echo $input | cut -d "," -f 3)"

        ecou $a
        ecou $b
        eco $c

        coada -n 1 fisierb | sed 's,'$a','$c',2'
Terminat

Cu o ieșire de:

K
26
T
KTTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
P
27
E
KKTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
S
31
P
KKTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Unde, de exemplu, șirul din poziția 31 ar trebui înlocuit cu S dacă este P.

Starea mea actuală este că variabilele a și c sunt transferate corect în comanda sed și șirurile respective sunt înlocuite, dar schimbându-le în sed 's,'$a','$c','$b'' oprește orice înlocuire și este solicitată linia nativă (ultima) a fileb.

Știu că a pune o întrebare bună este un alt subiect, dar sper că cineva mă poate ajuta să înțeleg scrierea de aici, astfel încât să pot continua să învăț programarea, deoarece deseori trec peste greșeli ca acestea.

hesey avatar
drapel vn
Numar 8 ghilimele, un numar par. Cum ar putea ultimul să fie un citat final neînchis?
drapel hr
Hopa, ai dreptate - scuze
hesey avatar
drapel vn
Cu siguranță prea multe citate :D Dar totuși vă mulțumesc pentru interesul de a ajuta!
Puncte:1
drapel cn

Note:

Dat:

$ cat filea
K,26,T
P,27,E
S,31,P

$ cat fileb
-------------------------TE---P---

atunci

coada -n 3 filea | în timp ce IFS=, citește caracterul de poziție de înlocuire -r; do
    printf -v regex '^(.{%d})%s' $((poziţia - 1)) "$caracter"
    printf -v repl '\1%s' "$inlocuire"

    echo „$regex”
    ecou „$repl”

    coada -n 1 fileb
    coada -n 1 fisierb | sed -E "s/$regex/$repl/"
Terminat

iesiri:

^(.{25})T
\1K
-------------------------TE---P---
-------------------------KE---P---
^(.{26})E
\1P
-------------------------TE---P---
-------------------------TP---P---
^(.{30})P
\1S
-------------------------TE---P---
-------------------------TE---S---

Dar, acesta este ceva ce bash poate face fără sed, folosind ${var:offset:length} formă de Extinderea parametrilor:

coada -n 3 filea | în timp ce IFS=, citește caracterul de poziție de înlocuire -r; do
    echo "$înlocuire $poziție $caracter"
    line=$(coada -n 1 fișierb)
    ecou "$line"
    dacă [[ "${line:position - 1:1}" == "$caracter" ]]; atunci
        line=${line:0:position - 1}${replacement}${line:position}
    fi
    ecou "$line"
Terminat

iesiri

K 26 T
-------------------------TE---P---
-------------------------KE---P---
P 27 E
-------------------------TE---P---
-------------------------TP---P---
S 31 p
-------------------------TE---P---
-------------------------TE---S---
hesey avatar
drapel vn
Din păcate, am făcut o mică greșeală tastând „înlocuit cu S dacă este P” când ar fi trebuit să fie „înlocuit cu P dacă este S”, dar am înțeles a doua ta abordare și am rescris-o pentru mine. Mulțumesc foarte mult!

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.