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
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
- huomautus bufdo ei ole POSIX pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html
- @StevenPenny on oikeassa. Käytän vain POSIX-määritettyjä ominaisuuksia henkilökohtaisesti komentosarjamuokkauksiin.
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
-i
tämän tiedoston sijasta ei toimi, se vain tulostaa vakiotiedostoon.