Hvordan tilføjer jeg tekst til begyndelsen og slutningen af flere tekstfiler i Bash?

Jeg har en mappe fuld af tekstfiler. Mit mål er at tilføje tekst til begyndelsen og slutningen af dem alle. Teksten, der går i begyndelsen og slutningen, er den samme for hver fil.

Baseret på kode, jeg fik fra internettet, er dette koden til at føje til begyndelsen af filen:

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

Dette er koden til tilføjelse til slutningen af filen. Målet er at tilføje teksten }; i slutningen af hver fil:

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

Eksemplerne, jeg trak fra var for at handle på individuelle sager. Jeg troede, jeg ville prøve at handle på flere filer ved hjælp af jokertegnet *.txt.

Jeg laver muligvis også andre fejl. Under alle omstændigheder, hvordan gør jeg det tilføje tekst til begyndelsen og slutningen af flere filer?

Svar

For at lægge tekst på en fil, kan du bruge (med GNU-implementering af sed):

sed -i "1i some string" file 

Tilføjelse af tekst er så enkel som

echo "Some other string" >> file 

Den sidste ting at gøre er at sætte det i en løkke, der gentages over alle de filer, du vil redigere:

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

Svar

Du kan bruge GNU sed

Som allerede illustreret kan du indsætte tekstlinjer lige før og efter matchning linjer i en fil med sed ved hjælp af henholdsvis kommandoen i og a. “t er vist er, at du kan gøre det med en one-liner og for flere filer på én gang.

Følgende indsætter en linje før den første 1i og efter den sidste linje $a. Indsættelserne udføres for alle filer, der matcher glob *.txt.

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

Begge i og a fungerer ikke kun med linjenumre, men også på hver linje, der matcher et givet mønster. Dette vil indsætte en kommentar, hver gang en linje indeholder var y = 2;:

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

Svar

Fuldt POSIX-kompatibel kommando ved hjælp af ex :

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

Hvis du kører printf -delen af kommandoen i sig selv, vil du se de nøjagtige redigeringskommandoer, som den overgår til ex:

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

0a betyder “Tilføj tekst efter linje 0 “(med andre ord før første linje). Den næste linje er den bogstavelige tekst, der skal “tilføjes” efter linje 0. Perioden (.) på en linje i sig selv slutter den tekst, der skal tilføjes.

$a betyder at tilføje tekst efter den sidste linje i filen.

x betyder at gemme ændringerne og afslutte .

Svar

Her “er en måde at gøre det på i Perl:

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

Kommentarer

  • @St é phaneChazelas tilføjer -i i stedet for denne filudskiftning fungerer ikke , den udskrives bare til stdout.
  • @OlehPrypin, faktisk din ret. Kommentar slettet.

Svar

Har også ret til at være (med resultater i .out filer):

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

En anden, mere uddybet variant – kildefiler erstattet med resultat:

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

Svar

Prøv at bruge ex:

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

hvor kommandoer er:

  • bufdo! udfører kommandoer nedenfor for hver åbnet buffer / fil (bemærk: det er ikke POSIX )
  • 1s/^/HEAD/ – indsætter HEAD tekst i den første linje i begyndelsen af linjen
  • $s/$/TAIL/ – tilføjer TAIL tekst på den sidste linje i slutningen af linjen

og argumenter er:

  • -s – lydløs / hurtig tilstand
  • -cxa – gem alle åbnede buffere / filer og afslut
  • *.foo – alle filer i den aktuelle mappe (*) med foo udvidelse, brug **/*.foo til rekursivitet (efter aktivering af globstar: shopt -s globstar)

Kommentarer

Svar

Med gnu awk ved hjælp af inplace udvidelse og BEGINFILE / ENDFILE:

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

Svar

Perl one-liner til undsætning:

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

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *