Cum pot adăuga text la începutul și la sfârșitul mai multor fișiere text din Bash?

Am un director plin de fișiere text. Scopul meu este să adaug text la începutul și la sfârșitul tuturor. Textul care merge la început și la sfârșit este același pentru fiecare fișier.

Pe baza codului pe care l-am primit de pe web, acesta este codul pentru adăugarea la începutul fișierului:

echo -e "var language = {\n$(cat $BASEDIR/Translations/Javascript/*.txt)" > $BASEDIR/Translations/Javascript/*.txt 

Acesta este codul pentru adăugarea la sfârșitul fișierului. Scopul este de a adăuga textul }; la sfârșitul fiecărui fișier:

echo "};" >> $BASEDIR/Translations/Javascript/*.txt 

Exemplele din care am extras au fost pentru acționarea asupra fișierelor individuale. Am crezut că aș încerca să acționez pe mai multe fișiere folosind metacaracterul, *.txt.

S-ar putea să fac și alte greșeli. În orice caz, cum adăugați text la începutul și la sfârșitul mai multor fișiere?

Răspundeți

Pentru a prepara textul la un fișier pe care îl puteți utiliza (cu Implementarea GNU a sed):

sed -i "1i some string" file 

Textul anexat este la fel de simplu ca

echo "Some other string" >> file 

Ultimul lucru de făcut este să puneți acest lucru într-o buclă care iterează peste toate fișierele pe care intenționați să le editați:

for file in *.txt; do sed -i "1i Some string" "$file" && echo "Some other string" >> "$file" done 

Răspuns

Puteți utiliza sed GNU

Ca deja ilustrat, puteți insera linii de text chiar înainte și după potrivire liniile unui fișier cu sed, utilizând comanda i și respectiv a. Ce nu are „Nu s-a arătat că o puteți face cu un singur liner și pentru mai multe fișiere simultan.

Următoarele vor insera o linie înainte de primul 1i și după ultima linie $a. Inserțiile vor fi executate pentru toate fișierele care corespund globului *.txt.

sed -i -e "1ivar language = {" -e "$a};" -- *.txt 

Ambele i și a nu funcționează numai cu numere de linie, ci și pe fiecare linie care se potrivește cu un model dat. Aceasta ar insera un comentariu ori de câte ori o linie conține var y = 2;:

sed -i -- "/var y = 2;/i//initialize variable y" *.js 

Răspuns

Comandă compatibilă cu POSIX, utilizând ex :

for f in *.txt; do printf "%s\n" 0a "var language = {" . "$a" "};" . x | ex "$f"; done 

Dacă rulați singură porțiunea printf a comenzii, veți vedea comenzile de editare exacte pe care le trece la ex:

0a var language = { . $a }; . x 

0a înseamnă „Atașează text după rândul 0 „(cu alte cuvinte, înainte de primul rând). Următorul rând este textul literal care trebuie „adăugat” după linia 0. Perioada (.) de pe o linie încheie singură textul care trebuie adăugat.

$a înseamnă a adăuga text după ultima linie a fișierului.

x înseamnă a salva modificările și a ieși .

Răspuns

Aici „o modalitate de a face acest lucru în Perl:

for f in ./*txt; do perl -lpe "BEGIN{print "First string"}END{print "Last string"}" "$f" > foo && mv foo "$f"; done 

Comentarii

  • @St é phaneChazelas adăugând -i în loc de înlocuirea fișierului nu funcționează, se imprimă doar în format standard.
  • @OlehPrypin, într-adevăr dreptul tău. Comentariul a fost șters.

Răspuns

De asemenea, are dreptul de a fi (cu rezultate în fișierele .out):

find . -name "*.txt" -exec sh -c "(echo HEAD;cat {};echo FOOT) > {}.out" \; 

O altă variantă mai elaborată – fișiere sursă înlocuite cu rezultatul:

find . -name "*.txt" -exec sh -c "(echo HEAD;cat {};echo FOOT) > {}.tmp && mv {}.tmp {}" \; -print 

Răspuns

Încercați să utilizați ex:

ex -s +"bufdo!1s/^/HEAD/|$s/$/TAIL/" -cxa *.foo 

unde sunt comenzile:

  • bufdo! execută comenzile de mai jos pentru fiecare buffer / fișier deschis (notă: nu este POSIX )
  • 1s/^/HEAD/ – inserează textul HEAD în prima linie de la începutul liniei
  • $s/$/TAIL/ – adaugă text TAIL pe ultima linie de la sfârșitul liniei

și argumentele sunt:

  • -s – modul silențios / rapid
  • -cxa – salvați toate bufferele / fișierele deschise și renunțați la
  • *.foo – toate fișierele din directorul curent (*) cu foo extensie, utilizați **/*.foo pentru recursivitate (după activarea globstar: shopt -s globstar)

Comentarii

Răspuns

Cu gnu awk, utilizând inplace extensie și BEGINFILE / ENDFILE:

gawk -i inplace "BEGINFILE{print "INSERT"};ENDFILE{print "APPEND"};1" ./*.txt 

Răspuns

Perl cu linie de salvare:

perl -i -pe"$_="FIRST LINE\n$_"if$.<2;$.=0,$_.="LAST LINE\n"if eof" *.txt 

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *