Trädvy Permalänk
Medlem
Registrerad
Jul 2007

Bash - Ersätta text med sed

Hej,

Jag har en massa filer i en mapp och dess undermappar där många börjar på exakt samma sätt, exempelvis:

<?php 43hjk2hjkr2k - rj32khrj3k2 - rh3j2khr 3j2hrk2_,1.,3¨fj3939fh392h.33.3-.43-f.h-y.-reewret.w--.rewt.-rye8933fh8932h8r392hrereiowe39riow89 r892rr--332-3-32¨32324902'+864543'624324'43fgrgryreeewrt'4r$'rewr3'22'rrewr'2'urioew838uurieoru302uirewr822rujrh3773?>

Efter detta innehåll i början så är resterande text i filerna olika.

Så vad jag behöver göra är att söka upp alla filer som innehåller denna inledande "texten" i en mapp och alla dess undermappar, och sedan ersätta den texten med något annat. Exempelvis: Hej, eller vad som helst. Resterande text i filen ska inte ändras.

Detta har jag försökt:
grep -rl rj32khrj3k2 /somedir/folder/ | xargs sed -i 's/rj32khrj3k2/Hej/g'

Även detta:
find /somedir/folder/ -type f -exec sed -i 's/rj32khrj3k2/Hej/g' {} \;

Men då säger sed: invalid command code V

Jag inser att det jag söker på, "rj32khrj3k2", troligtvis inte kommer resultera i att mitt ersättande ord "Hej" ersätter hela harrangen med denna märkliga inledande "text". Men jag behöver komma på något sätt att göra det på.

Hoppas ni kan förstår vad jag menar

(Jag kör med terminalen på min Mac.)

ASUS Z170 PRO GAMING | i7 6700K | Samsung 960 PRO 512GB | GTX 1080Ti FTW3 | Corsair 32GB (2x16GB) DDR4 3200MHz | EVGA Supernova G2 750W

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

Detta problem kanske?

Trädvy Permalänk
Medlem
Registrerad
Jul 2007

Tack, det funkade faktiskt. Åtminstone får jag inte felmeddelandet längre, men den ersätter endast precis det "ordet" jag söker på.

Nu behöver jag komma på hur jag gör för att ersätta hela den inledande texten.

ASUS Z170 PRO GAMING | i7 6700K | Samsung 960 PRO 512GB | GTX 1080Ti FTW3 | Corsair 32GB (2x16GB) DDR4 3200MHz | EVGA Supernova G2 750W

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av Asce:

Nu behöver jag komma på hur jag gör för att ersätta hela den inledande texten.

Har filerna annan php-kod i sig? Annars är det ju bara att ersätta allt mellan <?php och ?>.

T.ex. sed -i 's/^<?php.*?>$/Hej/g' {} \;

Trädvy Permalänk
Medlem
Registrerad
Jul 2007

@perost: Ja, de har annan text också. Vad jag kom på nu att egentligen behöver jag bara ersätta rad nr 1. Eftersom allt det står på rad nr1. Den ska ersättas med "<?php"

Jag är inte världsbäst på sed (ännu). Så jag har lite strul med att ersätta special characters på rätt sätt. Får inte rätt på det.

Så detta går ju inte då: sed -i '' '1s/.*/<?phq/

Hur gör jag för att "escape special characters" i detta fallet? (<?phq)

ASUS Z170 PRO GAMING | i7 6700K | Samsung 960 PRO 512GB | GTX 1080Ti FTW3 | Corsair 32GB (2x16GB) DDR4 3200MHz | EVGA Supernova G2 750W

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av Asce:

Hur gör jag för att "escape special characters" i detta fallet? (<?phq)

Ingen aning, det där fungerar bra för mig i Linux. Vad är det som blir fel?

Trädvy Permalänk
Medlem
Registrerad
Jul 2007

@perost: När jag trycker enter så hoppar markören bara till en ny rad som att den väntar på att jag ska mata in något mer. Jag fattar inte varför.

$ grep -rl something /somedir/folder/ | xargs sed -i '' '1s/.*/<?php/
>

ASUS Z170 PRO GAMING | i7 6700K | Samsung 960 PRO 512GB | GTX 1080Ti FTW3 | Corsair 32GB (2x16GB) DDR4 3200MHz | EVGA Supernova G2 750W

Trädvy Permalänk
Medlem
Plats
Sturup
Registrerad
Jan 2007
Skrivet av Asce:

@perost: När jag trycker enter så hoppar markören bara till en ny rad som att den väntar på att jag ska mata in något mer. Jag fattar inte varför.

$ grep -rl something /somedir/folder/ | xargs sed -i '' '1s/.*/<?php/
>

Nu sitter jag inte vid ngn terminal å kan prova, men har du inte missat en ' eller " ? De kommer väl alltid i par.

Skickades från m.sweclockers.com

Trädvy Permalänk
Medlem
Registrerad
Jul 2007

@theailer: Jag har två st sådana: '

Så det ser ut som en st sådan: "

Både '' och "" ger samma resultat för mig.

ASUS Z170 PRO GAMING | i7 6700K | Samsung 960 PRO 512GB | GTX 1080Ti FTW3 | Corsair 32GB (2x16GB) DDR4 3200MHz | EVGA Supernova G2 750W

Trädvy Permalänk
Medlem
Plats
Sturup
Registrerad
Jan 2007
Skrivet av Asce:

@theailer: Jag har två st sådana: '

Så det ser ut som en st sådan: "

Både '' och "" ger samma resultat för mig.

xargs sed -i '' '1s/.*/<?php/
Här ser det ut som du har tre stycken iofs.

Skickades från m.sweclockers.com

Trädvy Permalänk
Medlem
Registrerad
Jul 2007

@theailer: Hittade felet.. det ska ju vara en ' på slutet också,

sed -i '' '1s/.*/<?phq/'

Då går det.. Men dock körs det bara på en av filerna, fast att där ligger flera filer.

grep -rl something /somedir/folder/ | xargs sed -i '' '1s/.*/<?php/

Testade även: grep -rnw something /somedir/folder/ | xargs sed -i '' '1s/.*/<?php/

Får då följande fel:
sed: /somedir/folder//1.php:1:<?phq: No such file or directory

Update

ASUS Z170 PRO GAMING | i7 6700K | Samsung 960 PRO 512GB | GTX 1080Ti FTW3 | Corsair 32GB (2x16GB) DDR4 3200MHz | EVGA Supernova G2 750W

Trädvy Permalänk
Medlem
Plats
Sturup
Registrerad
Jan 2007

@Asce gött att just de fixade sig, resten vetetusan då jag oxo är en terminalnoob 😆

Skickades från m.sweclockers.com

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Okt 2006

Testa grep kommandot för sig och kolla vad du får. Jobba på grep-kommandot tills det blir rätt och kör sen igen.

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av Asce:

grep -rl something /somedir/folder/ | xargs sed -i '' '1s/.*/<?php/

Testade även: grep -rnw something /somedir/folder/ | xargs sed -i '' '1s/.*/<?php/

Du saknar ett ' i slutet även på de där kommandona, är det kanske bara det som är problemet?

Trädvy Permalänk
Medlem
Registrerad
Jul 2007

@perost: Upptäckte det efter en liten stund

Det fungerar nu på sätt och vis, men det ändrar endast på en fil, verkar som att den endast ändrar på den filen den hittar först. Så har man 100 filer får man köra det 100 ggr..haha

Ska fundera ut något.

ASUS Z170 PRO GAMING | i7 6700K | Samsung 960 PRO 512GB | GTX 1080Ti FTW3 | Corsair 32GB (2x16GB) DDR4 3200MHz | EVGA Supernova G2 750W

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Okt 2006

Vet inte riktigt varför du kör grep, då letar du efter något innehåll i en fil. Vill du hitta vissa filer ska du använda find. Så kan du hitta alla intressanta filer med find är du hemma.

Trädvy Permalänk
Medlem
Registrerad
Jul 2007

Okej, nu har jag löst det:

find ./ -name \*.php -exec sed -i '' -e '1s/.*/<?php/' {} \;

Detta hittar alla php-filer i alla mappar och ersätter rad nr 1 med <?php. Tydligen, eftersom jag använder mac, så funkar inte sed på exakt samma sätt som i Linux. Men ovan kommando gör jobbet, på osx.

ASUS Z170 PRO GAMING | i7 6700K | Samsung 960 PRO 512GB | GTX 1080Ti FTW3 | Corsair 32GB (2x16GB) DDR4 3200MHz | EVGA Supernova G2 750W