Jag har en katalog full med textfiler. Mitt mål är att lägga till text till början och slutet av dem alla. Texten som går i början och slutet är densamma för varje fil.
Baserat på kod jag fick från webben är detta koden för att lägga till i början av filen:
echo -e "var language = {\n$(cat $BASEDIR/Translations/Javascript/*.txt)" > $BASEDIR/Translations/Javascript/*.txt 
 Detta är koden för att läggas till i slutet av filen. Målet är att lägga till texten }; i slutet av varje fil: 
echo "};" >> $BASEDIR/Translations/Javascript/*.txt 
 Exemplen jag tog från var för att agera på enskilda filer. Jag trodde att jag skulle försöka agera på flera filer med jokertecken, *.txt. 
Jag kan också göra andra misstag. Hur som helst, hur gör jag lägga till text i början och slutet av flera filer?
Svar
 För att förbereda text till en fil som du kan använda (med GNU-implementering av sed): 
sed -i "1i some string" file 
Att lägga till text är så enkelt som
echo "Some other string" >> file 
Det sista du ska göra är att sätta det i en slinga som går igenom alla filer du tänker redigera:
for file in *.txt; do sed -i "1i Some string" "$file" && echo "Some other string" >> "$file" done 
Svar
Du kan använda GNU sed
 Som redan illustrerat kan du infoga textrader precis före och efter matchning rader i en fil med sed med kommandot i respektive a. ”t har visats är att du kan göra det med en enfodrad och för  flera filer  på en gång. 
 Följande infogar en rad före den första 1i och efter den sista raden $a. Insättningarna kommer att utföras för alla filer som matchar glob *.txt. 
sed -i -e "1ivar language = {" -e "$a};" -- *.txt 
 Båda i och a fungerar inte bara med radnummer utan också på varje rad som matchar ett visst mönster. Detta skulle infoga en kommentar när en rad innehåller var y = 2;: 
sed -i -- "/var y = 2;/i//initialize variable y" *.js 
Svar
 Helt POSIX-kompatibelt kommando med  ex : 
for f in *.txt; do printf "%s\n" 0a "var language = {" . "$a" "};" . x | ex "$f"; done 
 Om du kör printf -delen av kommandot i sig, ser du exakta redigeringskommandon som det övergår till ex: 
0a var language = { . $a }; . x 
 0a betyder ”Lägg till text efter rad 0 ”(med andra ord före första raden). Nästa rad är den bokstavliga texten som ska ”läggas till” efter rad 0. Perioden (.) på en rad i sig slutar texten som ska läggas till. 
 $a betyder att lägga till text efter den sista raden i filen. 
 x betyder att spara ändringarna och avsluta . 
Svar
Här ”är ett sätt att göra det i Perl:
for f in ./*txt; do perl -lpe "BEGIN{print "First string"}END{print "Last string"}" "$f" > foo && mv foo "$f"; done 
Kommentarer
Svar
 Har också rätt att vara (med resultat i .out filer): 
find . -name "*.txt" -exec sh -c "(echo HEAD;cat {};echo FOOT) > {}.out" \; 
En annan, mer detaljerad variant – källfiler ersatta med resultat:
find . -name "*.txt" -exec sh -c "(echo HEAD;cat {};echo FOOT) > {}.tmp && mv {}.tmp {}" \; -print 
Svar
 Försök använda ex: 
ex -s +"bufdo!1s/^/HEAD/|$s/$/TAIL/" -cxa *.foo 
där kommandon är:
-  
bufdo!kör kommandon nedan för varje öppnad buffert / fil (Obs: det är inte POSIX ) -  
1s/^/HEAD/– infogarHEADtext i första raden i början av raden -  
$s/$/TAIL/– lägger tillTAILtext på den sista raden i slutet av raden 
och argument är:
-  
-s– tyst / snabbt läge -  
-cxa– spara alla öppnade buffertar / filer och avsluta -  
*.foo– alla filer i den aktuella katalogen (*) medfooförlängning, använd**/*.fooför rekursivitet (efter att du har aktiverat globstar:shopt -s globstar) 
Kommentarer
- not bufdo är inte POSIX pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html
 - @StevenPenny har rätt. Jag använder endast POSIX-specificerade funktioner personligen för skriptredigeringar.
 
Svar
 Med gnu awk, med inplace förlängning och BEGINFILE / ENDFILE: 
gawk -i inplace "BEGINFILE{print "INSERT"};ENDFILE{print "APPEND"};1" ./*.txt 
Svar
Perl one-liner till undsättning:
perl -i -pe"$_="FIRST LINE\n$_"if$.<2;$.=0,$_.="LAST LINE\n"if eof" *.txt 
-iistället för denna filbyte fungerar inte , den skrivs bara ut till stdout.