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
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ă textulHEAD
în prima linie de la începutul liniei -
$s/$/TAIL/
– adaugă textTAIL
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 (*
) cufoo
extensie, utilizați**/*.foo
pentru recursivitate (după activarea globstar:shopt -s globstar
)
Comentarii
- not bufdo nu este POSIX pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html
- @StevenPenny are dreptate. Eu folosesc numai caracteristici specificate POSIX, personal, pentru editări cu script.
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
-i
în loc de înlocuirea fișierului nu funcționează, se imprimă doar în format standard.