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
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 (*
) sfoo
rozšíření, pro rekurzivitu použijte**/*.foo
(po povolení globstar:shopt -s globstar
)
Komentáře
- poznámka bufdo není POSIX pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html
- @StevenPenny má pravdu. Pro skriptované úpravy používám pouze funkce specifikované POSIX, osobně.
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
-i
místo tohoto nahrazení souborů nefunguje , pouze se vytiskne na standardní výstup.