it-swarm-eu.dev

SED: vložte text za poslední řádek?

Tento příkaz sed vloží značku na začátek souboru:

sed -i "1s/^/<?php /" file

Jak mohu něco vložit na konec každého souboru pomocí sed?

82
user2362

sed -e "\$aTEXTTOEND" je nejjednodušší způsob.

Jak to funguje

$ odpovídá poslednímu řádku (je to normální sed adresa; 4aTEXTTOEND vloží se za čtvrtý řádek), a je příkaz append a TEXTTOEND je co připojit.

101
bseller

V tomto případě není třeba použít sed. Co takhle

echo "<?php" >> file
34
innaM

Za předpokladu, že chcete do souborů vložit koncovou značku php

sed -i '$s/$/\n?>/' file

by měl udělat trik

25
Vinko Vrsalovic

Podívejte se na svůj původní příspěvek pro všechny v jednom příkazu sed.

find . -type f -exec sed -i -e "1s/^/<?php /" -e "\$s/\$/ ?>/" {} \;
5
Tim Desjardins

Použijte příkaz sed 'append (a)'. Například připojte dva řádky na konec souboru:

sed -i -e '$a\
foo1 bar1\
foo2 bar2' file
5
user2802945

Jednoduchým způsobem zapisovat a provádět změny obsahu na konkrétním řádku v souboru. Pokud chcete vložit cokoli na konkrétní číslo řádku, můžete použít příkaz níže:

sed -i '2i i have started' sheikh.log

kde 2i - řádek číslo 2 a i je zkratka pro vložení. Pokud musíte vložit na poslední řádek, použijte $ místo 2. Začal jsem - vkládá se text a sheikh.log je název souboru.

Můžeme také provést změny v řádku pomocí příkazu níže

sed -i '2c we have started' sheikh.log

i se změní na we.

Bez vrácení řádku/kočárku přidáním textu hello na konec řádku a úpravou souboru na místě bez výstupu na terminál

sed -i '$s/$/hello/' file
0
FastGTR

Ekvivalent vašeho sed -i '1s/^/<start</' file bylo by:

sed -i '$s/$/>end>/' file

Tím se přidá text >end> na poslední řádek (bez nových řádků) souboru. V tomto případě (stejně jako ve vašem příkladu) samozřejmě musíte, aby soubor obsahoval alespoň jeden řádek (nikoli prázdný).

Použití dvojitých uvozovek (jako ve vybrané odpovědi) není dobrý nápad, pak se Shell pokusí zpracovat každého $ v řetězci. Příkaz převede na:

sed -i "\$s/\$/>end>/" file

Pomocí a (připojit, ukončit) nebo i (vložit, začít) také vložíte nový řádek, vyžádáte si různá volání v BSD a GNU) a stále potřebujete neprázdný soubor.

Pro GNU:

$ sed '1i<start<' file
$ sed '$a>end>' file

Pro BSD:

$ sed '1i\
<start<' file
$ sed '$a\
>end>' file

Nebo ve skořápkách, které to umožňují (řetězec C):

$ sed $'1i\\\n<start<' file
$ sed $'$a\\\n>end>' file

Samozřejmě nic není jednodušší než:

echo '>end>' >> file

který pracuje také s prázdnými soubory.

0
Isaac

První a poslední

Předpokládal bych, že kdokoli, kdo hledal, jak vložit/připojit text na začátek/konec souboru, pravděpodobně také potřebuje vědět, jak udělat druhý.

cal |                            \
  gsed -E                        \
       -e     '1i\{'             \
       -e     '1i\  "lines": ['  \
       -e 's/(.*)/    "\1",/'    \
       -e '$s/,$//'              \
       -e     '$a\  ]'           \
       -e     '$a\}'

Vysvětlení

Toto je výstup cal přiváděný na gnu -sed (nazývaný gsed na MacOS nainstalovaný pomocí brew.sh ) s rozšířeným RegEx (-E) a 6 „skriptů“ použitých (-e) a konce řádků unikly s \ pro čitelnost. Skripty 1 a 2 používají 1i\ na „v řádku 1, vložte“. Skripty 5 a 6 používají $a\ k „na řádku <last>, připojit“. Svisle jsem zarovnal textové výstupy, aby kód reprezentoval to, co se ve výsledku očekává. Skripty 3 a 4 provádějí substituce (posledně uvedené platí pouze pro „řádek <last>“). Výsledkem je převod výstupu příkazu na platný JSON.

výstup

{
  "lines": [
    "    October 2019      ",
    "Su Mo Tu We Th Fr Sa  ",
    "       1  2  3  4  5  ",
    " 6  7  8  9 10 11 12  ",
    "13 14 15 16 17 18 19  ",
    "20 21 22 23 24 25 26  ",
    "27 28 29 30 31        ",
    "                      "
  ]
}
0
Bruno Bronosky