Nu este clar ce cap -3 *.txt | awk „{printează $4}”
revine aici deoarece nu ne-ați arătat totuși o mostră din fișierele dvs sed -i 's/GLN/LOO/g' *.txt
voi inlocui toate instanțele GLN în toate liniile in toate fișierele care se potrivesc *.TXT
, cu condiția ca bucla să se execute cel puțin o dată.
AFAIK nu există nicio modalitate directă de a aborda ultimul n linii ale unui fișier în sed - deci pentru a utiliza asta, ar trebui să calculați offset-ul extern, folosind wc -l
și aritmetica shell, de exemplu:
pentru f în *.txt; do
start=$(( $(wc -l <"$f") - 9 ))
sed "$start"',$s/GLN/LOO/g' "$f"
Terminat
(am eliminat -i
deci ieșirea merge la terminal, pentru testare). Ai putea folosi ceva de genul awk „END{print NR-9}” „$f”
in locul $(( $(wc -l <"$f") - 9 ))
pentru a obține compensarea de pornire dacă intenția ta a fost să folosești awk.
Alternativ ai putea folosi tac
pentru a inversa fișierul și a face înlocuiri în primul n linii, atunci tac
rezultatul - deși asta face înlocuirea pe loc complicată.
În această situație, probabil că aș ajunge la ed
sau ex
care suportă decalaje numerice de adrese, ex. testare cu ieșire către terminal:
pentru f în *.txt; do
printf '%s\n' '$-9,$s/GLN/LOO/g' ',p' | ed -s „$f”
Terminat
Odată ce ești fericit că face ceea ce trebuie, schimbă-te ,p
la wq
la wscrieți rezultatul în fișier (echivalentul lui sed -i
).