Hur lägger jag till text i början och slutet av flera textfiler i Bash?

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

  • @St é phaneChazelas lägger till -i istället för denna filbyte fungerar inte , den skrivs bara ut till stdout.
  • @OlehPrypin, verkligen din rätt. Kommentar borttagen.

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/ – infogar HEAD text i första raden i början av raden
  • $s/$/TAIL/ – lägger till TAIL text 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 (*) med foo förlängning, använd **/*.foo för rekursivitet (efter att du har aktiverat globstar: shopt -s globstar)

Kommentarer

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 

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *