Trädvy Permalänk
Medlem
Plats
Helsingborg
Registrerad
Jul 2007

unterminated string med awk

Jag har en fil som endast innehåller ett kort stycke html-kod, och en fil innehållandes en lista med emailadresser.

Jag ska ta denna html-kod och lägga som prefix på varje rad, så att den står före varje emailadress.

prefix1=$(cat in1.txt) awk -v prefix1=$prefix1 '{print prefix1 $0}' fil1 > fil2

html-koden i filen är:
<a href="mailto:

Får följande fel:
$ bash skript.sh

awk: href="mailto: awk: ^ unterminated string

Hur fixar jag detta?

ASUS Z170 PRO GAMING | i7 6700K | Samsung 960 PRO 512GB | GTX 1080 STRIX | Corsair 32GB (2x16GB) DDR4 3200MHz

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jul 2004

awk får problem med strängen för den letar efter en till dubbelfnutt. Nu är jag osäker men troligtvis vill den skanna av substrängen ifall den innehåller variabler.

Nu är jag ingen mästare på awk så jag använde mig av sed istället:

$ cat mails.txt brod@mail.mail korv@mail.mail senap@mail.mail

$ cat mails.txt | sed -r 's/^.+$/\<a href\=\"mailto\:&/g' <a href="mailto:brod@mail.mail <a href="mailto:korv@mail.mail <a href="mailto:senap@mail.mail

Dock antar jag att du även vill avsluta taggen vilket kan göras i samma kommando, t.ex.:

cat mails.txt | sed -r 's/^.+$/\<a href\=\"mailto\:&\"\>MAILA MIG!\<\/a\>/g' <a href="mailto:brod@mail.mail">MAILA MIG!</a> <a href="mailto:korv@mail.mail">MAILA MIG!</a> <a href="mailto:senap@mail.mail">MAILA MIG!</a>

Ifall du ska generera en massa HTML (d.v.s. detta var bara ett exempel av vad du ska göra) skulle jag nog rekommendera ett skriptspråk som förenklar strängmanipulering en hel del, t.ex. Perl eller Python, alternativt ett språk med ramverk avsätt för webbpublicering.

Efter att ni har läst det här har ni insett att det inte gav något.

Trädvy Permalänk
Forumledare
Registrerad
Okt 2002
Skrivet av Asce:

prefix1=$(cat in1.txt) awk -v prefix1=$prefix1 '{print prefix1 $0}' fil1 > fil2

Du måste lägga citationstecken runt $prefix1 när du vill använda det i skalet där; annars så säger du i praktiken något i stil med:

awk -v prefix1=<a href="mailto: '{print prefix1 $0}' fil1 > fil2

Då försöker du sätta AWK-variabeln prefix1 till <a och sedan köra AWK-kommandot href="mailto: på filerna {print prefix1 $0} och fil1. Inte så lyckat.

Illustrerat:

$ prefix1="foo" $ printf 'rad 1\nrad 2\n' | awk -v prefix1=$prefix1 '{print prefix1 $0}' foorad 1 foorad 2 $ prefix1="foo bar" $ printf 'rad 1\nrad 2\n' | awk -v prefix1=$prefix1 '{print prefix1 $0}' awk: fatal: cannot open file `{print prefix1 $0}' for reading (No such file or directory) $ printf 'rad 1\nrad 2\n' | awk -v prefix1="$prefix1" '{print prefix1 $0}' foo barrad 1 foo barrad 2

Därtill så kan man som regel säga att när cat används i ett skript så görs det felaktigt/i onödan . Ska du bara läsa en rad som här så är det enklare att köra:

read prefix1 < in1.txt

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.