Van egy könyvtáram, tele szöveges fájlokkal. Célom, hogy szöveget csatoljak mindegyik elejére és végére. Az elején és a végén lévő szöveg minden fájlnál megegyezik.
A webről kapott kód alapján ez a kód a fájl elejéhez csatoláshoz:
echo -e "var language = {\n$(cat $BASEDIR/Translations/Javascript/*.txt)" > $BASEDIR/Translations/Javascript/*.txt
Ez a kód a fájl végéhez fűzéshez. A cél az, hogy minden fájl végén hozzáadjuk a };
szöveget:
echo "};" >> $BASEDIR/Translations/Javascript/*.txt
Azok a példák, amelyekből levontam az egyes akták alapján való cselekvésre szóltak. Azt hittem, megpróbálok több fájlra is helyettesíteni a helyettesítő karakterrel, *.txt
.
Lehet, hogy más hibákat is elkövetek. Mindenesetre hogyan tegyem szöveget csatoljon több fájl elejéhez és végéhez?
Válasz
Szöveg előzetes hozzáadásához egy fájlhoz (a A sed
) GNU-implementációja:
sed -i "1i some string" file
A szöveg hozzáadása olyan egyszerű, mint
echo "Some other string" >> file
Az utolsó tennivaló az, hogy ezt egy ciklusba helyezi, amely az összes szerkeszteni kívánt fájlt megismétli:
for file in *.txt; do sed -i "1i Some string" "$file" && echo "Some other string" >> "$file" done
Válasz
Használhatja a GNU sed
A már bemutatottakhoz hasonlóan szövegsorokat is beilleszthet egyezés elé és utána Egy sed
fájl sorai, a i
és a
paranccsal. “bebizonyosodott, hogy megteheti egy béléssel, és a >
több fájl egyszerre.
A következők beillesztenek egy sort az első 1i
elé és az utolsó sor után $a
. A beillesztéseket minden olyan fájl végrehajtja, amely megfelel a glob *.txt
.
sed -i -e "1ivar language = {" -e "$a};" -- *.txt
Mindkét és a a
nemcsak sorszámokkal, hanem minden olyan sorral is működik, amely megfelel egy adott mintának. Ez egy megjegyzést illesztene be, amikor egy sor var y = 2;
-t tartalmaz:
sed -i -- "/var y = 2;/i//initialize variable y" *.js
Válasz
Teljesen POSIX-kompatibilis parancs, ex
használatával:
for f in *.txt; do printf "%s\n" 0a "var language = {" . "$a" "};" . x | ex "$f"; done
Ha a parancs printf
részét önállóan futtatja, akkor a pontos szerkesztési parancsok láthatók átkerül a ex
címre:
0a var language = { . $a }; . x
0a
jelentése: “Hozzáfűzés” szöveg a 0 “sor után (más szavakkal, az első sor előtt). A következő sor a szó szerint “hozzáfűzendő” szöveg a 0. sor után. A sor (.
) pontja önmagában befejezi a hozzáadandó szöveget.
Az $a
azt jelenti, hogy szöveget kell hozzáfűzni a fájl utolsó sora után.
x
a módosítások mentését és kilépést jelenti .
Válasz
Itt van a módja a Perl-ben:
for f in ./*txt; do perl -lpe "BEGIN{print "First string"}END{print "Last string"}" "$f" > foo && mv foo "$f"; done
Megjegyzések
Válasz
Joga is lenni (.out
fájlok eredményével):
find . -name "*.txt" -exec sh -c "(echo HEAD;cat {};echo FOOT) > {}.out" \;
Egy másik, tovább kidolgozott változat – forrásfájlok helyettesítve az eredménnyel:
find . -name "*.txt" -exec sh -c "(echo HEAD;cat {};echo FOOT) > {}.tmp && mv {}.tmp {}" \; -print
Válasz
Próbálja ki a ex
alkalmazást:
ex -s +"bufdo!1s/^/HEAD/|$s/$/TAIL/" -cxa *.foo
ahol a parancsok találhatók:
-
bufdo!
az alábbi parancsokat hajtja végre minden megnyitott puffer / fájl esetében (megjegyzés: ez nem POSIX ) -
1s/^/HEAD/
– beszúrHEAD
szöveget a sor elején lévő első sorba -
$s/$/TAIL/
–TAIL
szöveget fűz a sor utolsó sorához
és érvek:
-
-s
– néma / gyors mód -
-cxa
– mentse az összes megnyitott puffert / fájlt és lépjen ki -
*.foo
– az összes fájl az aktuális könyvtárban (*
) afoo
kiterjesztés, használja a**/*.foo
elemet a rekurzivitáshoz (a globstar engedélyezése után:shopt -s globstar
)
megjegyzések
- a bufdo nem POSIX pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html
- @StevenPenny-nek igaza van. Csak POSIX által meghatározott szolgáltatásokat használok, személyesen szkriptelt szerkesztésekhez.
Válasz
A következővel: gnu awk
, a inplace
kiterjesztés és BEGINFILE
/ ENDFILE
:
gawk -i inplace "BEGINFILE{print "INSERT"};ENDFILE{print "APPEND"};1" ./*.txt
Válasz
Perl egysoros a mentéshez:
perl -i -pe"$_="FIRST LINE\n$_"if$.<2;$.=0,$_.="LAST LINE\n"if eof" *.txt
-i
e fájl helyett a helyettesítés nem működik, csak a stdout-ra nyomtat.