Hogyan csatolhatok szöveget a Bash több szöveges fájljának elejére és végére?

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

  • @St é phaneChazelas hozzáadva a -i e fájl helyett a helyettesítés nem működik, csak a stdout-ra nyomtat.
  • @OlehPrypin, valóban a jogod. A megjegyzés törölve.

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úr HEAD 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 (*) a foo kiterjesztés, használja a **/*.foo elemet a rekurzivitáshoz (a globstar engedélyezése után: shopt -s globstar)

megjegyzések

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 

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük