Jak připojím text na začátek a konec více textových souborů v Bash?

Mám adresář plný textových souborů. Mým cílem je připojit text na začátek a konec všech z nich. Text, který jde na začátek a na konec, je pro každý soubor stejný.

Na základě kódu, který jsem získal z webu, se jedná o kód pro připojení na začátek souboru:

echo -e "var language = {\n$(cat $BASEDIR/Translations/Javascript/*.txt)" > $BASEDIR/Translations/Javascript/*.txt 

Toto je kód pro připojení na konec souboru. Cílem je přidat text }; na konec každého souboru:

echo "};" >> $BASEDIR/Translations/Javascript/*.txt 

Příklady, z nichž jsem čerpal byly za jednání podle jednotlivých spisů. Myslel jsem, že se pokusím jednat s více soubory pomocí zástupného znaku *.txt.

Možná dělám i jiné chyby. V každém případě, jak připojit text na začátek a konec více souborů?

Odpovědět

Chcete-li předložit text do souboru, můžete použít (pomocí GNU implementace sed):

sed -i "1i some string" file 

Přidání textu je stejně jednoduché jako

echo "Some other string" >> file 

Poslední věcí, kterou musíte udělat, je dát to do smyčky, která iteruje přes všechny soubory, které chcete upravit:

for file in *.txt; do sed -i "1i Some string" "$file" && echo "Some other string" >> "$file" done 

Odpověď

Můžete použít GNU sed

Jak již bylo uvedeno, můžete vkládat řádky textu těsně před a po shodě řádky souboru s sed pomocí příkazů i a a. Co nemá „nebylo ukázáno, že to můžete udělat pomocí jednorázové linky a pro více souborů najednou.

Následující text vloží řádek před první 1i a za poslední řádek $a. Vložení se provedou pro všechny soubory odpovídající glob *.txt.

sed -i -e "1ivar language = {" -e "$a};" -- *.txt 

Oba i a a nefungují pouze s čísly řádků, ale také na každém řádku, který odpovídá danému vzoru. To by vložilo komentář pokaždé, když řádek obsahuje var y = 2;:

sed -i -- "/var y = 2;/i//initialize variable y" *.js 

odpověď

Plně kompatibilní s příkazem POSIX pomocí ex :

for f in *.txt; do printf "%s\n" 0a "var language = {" . "$a" "};" . x | ex "$f"; done 

Pokud spustíte část printf samostatně, uvidíte přesné příkazy pro úpravy, které obsahuje předává ex:

0a var language = { . $a }; . x 

0a znamená „Připojit“ text za řádkem 0 „(jinými slovy před prvním řádkem). Další řádek je doslovný text, který se přidá za řádek 0. Období (.) na řádku samo o sobě končí text, který má být připojen.

$a znamená připojit text za poslední řádek souboru.

x znamená uložit změny a ukončit .

Odpovědět

Zde je způsob, jak to udělat v Perlu:

for f in ./*txt; do perl -lpe "BEGIN{print "First string"}END{print "Last string"}" "$f" > foo && mv foo "$f"; done 

Komentáře

  • @St é phaneChazelas přidáním -i místo tohoto nahrazení souborů nefunguje , pouze se vytiskne na standardní výstup.
  • @OlehPrypin, skutečně vaše právo. Komentář smazán.

Odpověď

Má také právo být (s výsledky v .out souborech):

find . -name "*.txt" -exec sh -c "(echo HEAD;cat {};echo FOOT) > {}.out" \; 

Další, propracovanější varianta – zdrojové soubory nahrazeny výsledkem:

find . -name "*.txt" -exec sh -c "(echo HEAD;cat {};echo FOOT) > {}.tmp && mv {}.tmp {}" \; -print 

Odpovědět

Zkuste použít ex:

ex -s +"bufdo!1s/^/HEAD/|$s/$/TAIL/" -cxa *.foo 

kde jsou příkazy:

  • bufdo! provádí níže uvedené příkazy pro každou otevřenou vyrovnávací paměť / soubor (poznámka: není to POSIX )
  • 1s/^/HEAD/ – vloží HEAD text do prvního řádku na začátek řádku
  • $s/$/TAIL/ – připojí TAIL text na poslední řádek na konec řádku

a argumenty jsou:

  • -s – tichý / rychlý režim
  • -cxa – uložit všechny otevřené vyrovnávací paměti / soubory a ukončit
  • *.foo – všechny soubory v aktuálním adresáři (*) s foo rozšíření, pro rekurzivitu použijte **/*.foo (po povolení globstar: shopt -s globstar)

Komentáře

Odpověď

Pomocí gnu awk pomocí inplace rozšíření a BEGINFILE / ENDFILE:

gawk -i inplace "BEGINFILE{print "INSERT"};ENDFILE{print "APPEND"};1" ./*.txt 

Odpověď

Perl jednorázový na záchranu:

perl -i -pe"$_="FIRST LINE\n$_"if$.<2;$.=0,$_.="LAST LINE\n"if eof" *.txt 

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *