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/
– infogarHEAD
text i första raden i början av raden -
$s/$/TAIL/
– lägger tillTAIL
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 (*
) medfoo
förlängning, använd**/*.foo
fö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
-i
istället för denna filbyte fungerar inte , den skrivs bara ut till stdout.