Kuinka liitän tekstiä Bashin useiden tekstitiedostojen alkuun ja loppuun?

Minulla on hakemisto täynnä tekstitiedostoja. Tavoitteenani on liittää teksti kaikkien niiden alkuun ja loppuun. Alussa ja lopussa oleva teksti on sama jokaiselle tiedostolle.

Verkosta saamani koodin perusteella tämä on koodi, joka liitetään tiedoston alkuun:

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

Tämä on koodi, joka liitetään tiedoston loppuun. Tavoitteena on lisätä teksti }; jokaisen tiedoston loppuun:

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

Esimerkit, joista piirsin oli tarkoitettu toimimaan yksittäisissä tiedostoissa. Ajattelin yrittää toimia useissa tiedostoissa jokerimerkillä, *.txt.

Saatan tehdä myös muita virheitä. Joka tapauksessa, miten liitetäänkö teksti useiden tiedostojen alkuun ja loppuun?

Vastaa

Voit lisätä tekstiä tiedostoon, jota voit käyttää ( sed): n GNU-toteutus:

sed -i "1i some string" file 

Tekstin lisääminen on yhtä yksinkertaista kuin

echo "Some other string" >> file 

Viimeinen tehtävä on laittaa se silmukkaan, joka toistaa kaikki muokattavat tiedostot:

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

vastaus

Voit käyttää GNU sed

Kuten jo on esitetty, voit lisätä tekstiriviä heti ennen ja jälkeen vastaavuuden sed -tiedoston rivit käyttämällä komentoja i ja a. ”Ei ole osoitettu, että voit tehdä sen yksilinjalla ja useita tiedostoja kerralla.

Seuraavassa lisätään rivi ensimmäisen 1i eteen ja viimeisen rivin jälkeen $a. Lisäykset suoritetaan kaikille tiedostoille, jotka vastaavat glob *.txt.

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

Molemmat i ja a eivät toimi vain rivinumeroilla, mutta myös jokaisella rivillä, joka vastaa tiettyä mallia. Tämä lisäisi kommentin aina, kun rivi sisältää var y = 2;:

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

vastaus

Täysin POSIX-yhteensopiva komento käyttäen ex :

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

Jos suoritat komennon printf -osan itse, näet tarkat muokkauskomennot, jotka se on antanut kulkee osoitteeseen ex:

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

0a tarkoittaa ”Liitä” teksti rivin 0 ”jälkeen (toisin sanoen ennen ensimmäistä riviä). Seuraava rivi on kirjaimellinen teksti, joka lisätään ”liitteeseen” rivin 0 jälkeen. Rivillä oleva piste (.) päättää itse liitettävän tekstin.

$a tarkoittaa tekstin lisäämistä tiedoston viimeisen rivin jälkeen.

x tarkoittaa muutosten tallentamista ja poistumista .

Vastaa

Tässä on tapa tehdä se Perlissä:

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

kommentit

  • @St é phaneChazelas lisäämällä -i tämän tiedoston sijasta ei toimi, se vain tulostaa vakiotiedostoon.
  • @OlehPrypin, todellakin oikeutesi. Kommentti poistettu.

vastaus

Oikeus olla myös (tulokset .out -tiedostoissa):

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

Toinen, yksityiskohtaisempi muunnelma – lähdetiedostot korvataan tuloksella:

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

Vastaa

Yritä käyttää ex:

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

missä komennot ovat:

  • bufdo! suorittaa alla olevat komennot jokaiselle avatulle puskurille / tiedostolle (huomautus: se ei ole POSIX )
  • 1s/^/HEAD/ – lisää HEAD tekstin rivin alun ensimmäiselle riville
  • $s/$/TAIL/ – liittää TAIL -tekstin rivin lopun viimeiselle riville

ja argumentit ovat:

  • -s – hiljainen / nopea tila
  • -cxa – tallenna kaikki avoimet puskurit / tiedostot ja lopeta
  • *.foo – kaikki nykyisen hakemiston tiedostot (*) foo -laajennus, käytä rekursiivisuuteen **/*.foo (kun globstar on otettu käyttöön: shopt -s globstar)

kommentit

Vastaa

Kanssa gnu awk, käyttäen inplace laajennus ja BEGINFILE / ENDFILE:

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

Vastaa

Perlin yhden linjan pelastus:

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

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *