Jeg har en mappe fuld af tekstfiler. Mit mål er at tilføje tekst til begyndelsen og slutningen af dem alle. Teksten, der går i begyndelsen og slutningen, er den samme for hver fil.
Baseret på kode, jeg fik fra internettet, er dette koden til at føje til begyndelsen af filen:
echo -e "var language = {\n$(cat $BASEDIR/Translations/Javascript/*.txt)" > $BASEDIR/Translations/Javascript/*.txt
Dette er koden til tilføjelse til slutningen af filen. Målet er at tilføje teksten };
i slutningen af hver fil:
echo "};" >> $BASEDIR/Translations/Javascript/*.txt
Eksemplerne, jeg trak fra var for at handle på individuelle sager. Jeg troede, jeg ville prøve at handle på flere filer ved hjælp af jokertegnet *.txt
.
Jeg laver muligvis også andre fejl. Under alle omstændigheder, hvordan gør jeg det tilføje tekst til begyndelsen og slutningen af flere filer?
Svar
For at lægge tekst på en fil, kan du bruge (med GNU-implementering af sed
):
sed -i "1i some string" file
Tilføjelse af tekst er så enkel som
echo "Some other string" >> file
Den sidste ting at gøre er at sætte det i en løkke, der gentages over alle de filer, du vil redigere:
for file in *.txt; do sed -i "1i Some string" "$file" && echo "Some other string" >> "$file" done
Svar
Du kan bruge GNU sed
Som allerede illustreret kan du indsætte tekstlinjer lige før og efter matchning linjer i en fil med sed
ved hjælp af henholdsvis kommandoen i
og a
. “t er vist er, at du kan gøre det med en one-liner og for flere filer på én gang.
Følgende indsætter en linje før den første 1i
og efter den sidste linje $a
. Indsættelserne udføres for alle filer, der matcher glob *.txt
.
sed -i -e "1ivar language = {" -e "$a};" -- *.txt
Begge i
og a
fungerer ikke kun med linjenumre, men også på hver linje, der matcher et givet mønster. Dette vil indsætte en kommentar, hver gang en linje indeholder var y = 2;
:
sed -i -- "/var y = 2;/i//initialize variable y" *.js
Svar
Fuldt POSIX-kompatibel kommando ved hjælp af ex
:
for f in *.txt; do printf "%s\n" 0a "var language = {" . "$a" "};" . x | ex "$f"; done
Hvis du kører printf
-delen af kommandoen i sig selv, vil du se de nøjagtige redigeringskommandoer, som den overgår til ex
:
0a var language = { . $a }; . x
0a
betyder “Tilføj tekst efter linje 0 “(med andre ord før første linje). Den næste linje er den bogstavelige tekst, der skal “tilføjes” efter linje 0. Perioden (.
) på en linje i sig selv slutter den tekst, der skal tilføjes.
$a
betyder at tilføje tekst efter den sidste linje i filen.
x
betyder at gemme ændringerne og afslutte .
Svar
Her “er en måde at gøre det på 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 også ret til at være (med resultater i .out
filer):
find . -name "*.txt" -exec sh -c "(echo HEAD;cat {};echo FOOT) > {}.out" \;
En anden, mere uddybet variant – kildefiler erstattet med resultat:
find . -name "*.txt" -exec sh -c "(echo HEAD;cat {};echo FOOT) > {}.tmp && mv {}.tmp {}" \; -print
Svar
Prøv at bruge ex
:
ex -s +"bufdo!1s/^/HEAD/|$s/$/TAIL/" -cxa *.foo
hvor kommandoer er:
-
bufdo!
udfører kommandoer nedenfor for hver åbnet buffer / fil (bemærk: det er ikke POSIX ) -
1s/^/HEAD/
– indsætterHEAD
tekst i den første linje i begyndelsen af linjen -
$s/$/TAIL/
– tilføjerTAIL
tekst på den sidste linje i slutningen af linjen
og argumenter er:
-
-s
– lydløs / hurtig tilstand -
-cxa
– gem alle åbnede buffere / filer og afslut -
*.foo
– alle filer i den aktuelle mappe (*
) medfoo
udvidelse, brug**/*.foo
til rekursivitet (efter aktivering af globstar:shopt -s globstar
)
Kommentarer
- note bufdo er ikke POSIX pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html
- @StevenPenny har ret. Jeg bruger kun POSIX-specificerede funktioner personligt til redigeringer i script.
Svar
Med gnu awk
ved hjælp af inplace
udvidelse og BEGINFILE
/ ENDFILE
:
gawk -i inplace "BEGINFILE{print "INSERT"};ENDFILE{print "APPEND"};1" ./*.txt
Svar
Perl one-liner til undsætning:
perl -i -pe"$_="FIRST LINE\n$_"if$.<2;$.=0,$_.="LAST LINE\n"if eof" *.txt
-i
i stedet for denne filudskiftning fungerer ikke , den udskrives bare til stdout.