Permalänk
Medlem

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.)

Visa signatur

💻 ROG Maximus XI Hero | i9 9900K | Corsair H115i | Samsung 960 PRO 512GB M.2 | Samsung 970 PRO 1TB M.2 | GTX 1080Ti FTW3 | Corsair 32GB (2x16GB) DDR4 3200MHz | EVGA Supernova G2 750W
📺 Dell Alienware AW2723DF 1440p 280 Hz | Acer XB271HU 1440p 165Hz
🎧 Schiit stack: Magni 3+ AMP | Modi 3 DAC | Sennheiser HD600 | HD800

Permalänk
Medlem

Detta problem kanske?

Permalänk
Medlem

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.

Visa signatur

💻 ROG Maximus XI Hero | i9 9900K | Corsair H115i | Samsung 960 PRO 512GB M.2 | Samsung 970 PRO 1TB M.2 | GTX 1080Ti FTW3 | Corsair 32GB (2x16GB) DDR4 3200MHz | EVGA Supernova G2 750W
📺 Dell Alienware AW2723DF 1440p 280 Hz | Acer XB271HU 1440p 165Hz
🎧 Schiit stack: Magni 3+ AMP | Modi 3 DAC | Sennheiser HD600 | HD800

Permalänk
Medlem
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' {} \;

Permalänk
Medlem

@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)

Visa signatur

💻 ROG Maximus XI Hero | i9 9900K | Corsair H115i | Samsung 960 PRO 512GB M.2 | Samsung 970 PRO 1TB M.2 | GTX 1080Ti FTW3 | Corsair 32GB (2x16GB) DDR4 3200MHz | EVGA Supernova G2 750W
📺 Dell Alienware AW2723DF 1440p 280 Hz | Acer XB271HU 1440p 165Hz
🎧 Schiit stack: Magni 3+ AMP | Modi 3 DAC | Sennheiser HD600 | HD800

Permalänk
Medlem
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?

Permalänk
Medlem

@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/
>

Visa signatur

💻 ROG Maximus XI Hero | i9 9900K | Corsair H115i | Samsung 960 PRO 512GB M.2 | Samsung 970 PRO 1TB M.2 | GTX 1080Ti FTW3 | Corsair 32GB (2x16GB) DDR4 3200MHz | EVGA Supernova G2 750W
📺 Dell Alienware AW2723DF 1440p 280 Hz | Acer XB271HU 1440p 165Hz
🎧 Schiit stack: Magni 3+ AMP | Modi 3 DAC | Sennheiser HD600 | HD800

Permalänk
Medlem
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

Permalänk
Medlem

@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.

Visa signatur

💻 ROG Maximus XI Hero | i9 9900K | Corsair H115i | Samsung 960 PRO 512GB M.2 | Samsung 970 PRO 1TB M.2 | GTX 1080Ti FTW3 | Corsair 32GB (2x16GB) DDR4 3200MHz | EVGA Supernova G2 750W
📺 Dell Alienware AW2723DF 1440p 280 Hz | Acer XB271HU 1440p 165Hz
🎧 Schiit stack: Magni 3+ AMP | Modi 3 DAC | Sennheiser HD600 | HD800

Permalänk
Medlem
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

Permalänk
Medlem

@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
Visa signatur

💻 ROG Maximus XI Hero | i9 9900K | Corsair H115i | Samsung 960 PRO 512GB M.2 | Samsung 970 PRO 1TB M.2 | GTX 1080Ti FTW3 | Corsair 32GB (2x16GB) DDR4 3200MHz | EVGA Supernova G2 750W
📺 Dell Alienware AW2723DF 1440p 280 Hz | Acer XB271HU 1440p 165Hz
🎧 Schiit stack: Magni 3+ AMP | Modi 3 DAC | Sennheiser HD600 | HD800

Permalänk
Medlem

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

Skickades från m.sweclockers.com

Permalänk
Hedersmedlem

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.

Permalänk
Medlem
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?

Permalänk
Medlem

@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.

Visa signatur

💻 ROG Maximus XI Hero | i9 9900K | Corsair H115i | Samsung 960 PRO 512GB M.2 | Samsung 970 PRO 1TB M.2 | GTX 1080Ti FTW3 | Corsair 32GB (2x16GB) DDR4 3200MHz | EVGA Supernova G2 750W
📺 Dell Alienware AW2723DF 1440p 280 Hz | Acer XB271HU 1440p 165Hz
🎧 Schiit stack: Magni 3+ AMP | Modi 3 DAC | Sennheiser HD600 | HD800

Permalänk
Hedersmedlem

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.

Permalänk
Medlem

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.

Visa signatur

💻 ROG Maximus XI Hero | i9 9900K | Corsair H115i | Samsung 960 PRO 512GB M.2 | Samsung 970 PRO 1TB M.2 | GTX 1080Ti FTW3 | Corsair 32GB (2x16GB) DDR4 3200MHz | EVGA Supernova G2 750W
📺 Dell Alienware AW2723DF 1440p 280 Hz | Acer XB271HU 1440p 165Hz
🎧 Schiit stack: Magni 3+ AMP | Modi 3 DAC | Sennheiser HD600 | HD800