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ääHEADtekstin 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 
-itämän tiedoston sijasta ei toimi, se vain tulostaa vakiotiedostoon.