Ersätta felstavad sträng med rättstavad dito

Här diskuterar vi skal, kommandon och klassiska linuxverktyg.
Användarvisningsbild
dmz
Inlägg: 3292
Blev medlem: 29 jul 2008, 19:42
OS: Arch Linux

Ersätta felstavad sträng med rättstavad dito

Inlägg av dmz »

Trådtiteln säger väl allt, eller inte. :p

Jag har iallafall knåpat ihop ett script för att underlätta spellistehantering i mpd, och det ser ut som följer;

Kod: Markera allt

#!/bin/sh
# mpdfav
# WTFPL etc.
#
# Feel free to patch and send me the diff

## Thu Sep 17 18:14:03 CEST 2009
# fixed 'bug' with empty id3-tags and retarded people who cannot spell
#

## Sat Sep 12 07:57:56 CEST 2009
# Creating playlists based on date was pretty useless for me; instead, it now
# reads the 'genre'-id3-tag. 



# First off, some nice colors ey?
GRAY="\033[1;30m"
LIGHT_GRAY="\033[0;37m"
CYAN="\033[0;36m"
LIGHT_CYAN="\033[1;36m"
ORANGE="\033[1;31m"
NO_COLOR="\033[0m"

BOLD="\033[1m"

# Where do you want your playlists hidden?
LISTDIR=/mnt/Music_1/Playlists
GENRE=$(mpc --format %genre%|head -1)


# If called with an argument, that'll be the name of the playlist
if [ "$1" ]; 
then
	NAME="$1.m3u"

elif [ -z $GENRE ];
then
        NAME="random.m3u"
else
	NAME="$(echo $GENRE|tr A-Z a-z|sed 's/[Pp]sychadelic/psychedelic/').m3u"
fi

# Check if file exists ... 
if [ -f "$LISTDIR/$NAME" ]; 
then
	mpc --format %file%|head -1 >> "$LISTDIR/$NAME"

# If not... (some people claim this is useless since >> would automagically
# create the file if it does not exist)
else
	mpc --format %file%|head -1 > "$LISTDIR/$NAME"
fi

echo -e "$BOLD $ORANGE
CONTENT: $NO_COLOR\n
$CYAN`cat "$LISTDIR/$NAME"`$NO_COLOR \n$ORANGE 
`cat "$LISTDIR/$NAME"|wc -l`$NO_COLOR tracks in $GRAY "$LISTDIR/$NAME"
$NO_COLOR
$BOLD $ORANGE
Latest: $NOCOLOR$CYAN`cat "$LISTDIR/$NAME"|tail -1`$NO_COLOR
"
Det jag stör mig på är alltså användningen av sed här;

Kod: Markera allt

	NAME="$(echo $GENRE|tr A-Z a-z|sed 's/[Pp]sychadelic/psychedelic/').m3u"
Väldigt, väldigt fult. Hur löser man detta på ett snyggare sätt? Kanske jämföra $GENRE med en array av möjliga felstavningar, för att isåfall ersätta med en korrekt? Inte heller det kommer att vara 100%-igt, men kanske lite snyggare?
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
Användarvisningsbild
per9000
Inlägg: 931
Blev medlem: 07 maj 2007, 11:06
OS: Ubuntu
Utgåva: 23.04 Lunar Lobster
Ort: Västerås
Kontakt:

Re: Ersätta felstavad sträng med rättstavad dito

Inlägg av per9000 »

Jag hade satsat på att lusläsa

Kod: Markera allt

man ispell
.

http://www.math.sc.edu/system/man/ispell.html

/P
--
Per Erik Strandberg
Yet Another IT Consultant
Användarvisningsbild
dmz
Inlägg: 3292
Blev medlem: 29 jul 2008, 19:42
OS: Arch Linux

Re: Ersätta felstavad sträng med rättstavad dito

Inlägg av dmz »

Ingen?
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
Användarvisningsbild
dmz
Inlägg: 3292
Blev medlem: 29 jul 2008, 19:42
OS: Arch Linux

Re: Ersätta felstavad sträng med rättstavad dito

Inlägg av dmz »

Bumpar igen. :/
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Ersätta felstavad sträng med rättstavad dito

Inlägg av Konservburk »

dmz skrev:Det jag stör mig på är alltså användningen av sed här;

Kod: Markera allt

	NAME="$(echo $GENRE|tr A-Z a-z|sed 's/[Pp]sychadelic/psychedelic/').m3u"
Väldigt, väldigt fult. Hur löser man detta på ett snyggare sätt? Kanske jämföra $GENRE med en array av möjliga felstavningar, för att isåfall ersätta med en korrekt? Inte heller det kommer att vara 100%-igt, men kanske lite snyggare?
Egentligen vill du jämföra det felstavade ordet med varje ord i en godkänd ordlista och på något sätt mäta "avståndet" mellan dem och därefter ersätta det felstavade ordet med det godkända ord som är kortast "avstånd" till. Med "avståndet" menar jag ett mätetal som avgör hur pass lika orden är varandra, där 0 betyder att orden är identiska. Jag är ganska säker på att det finns färdiga algorithmer för sådana mätningar, men jag har aldrig pysslat med det, så jag kan inte knuffa dig i rätt riktning mer än så här.

En enkel och ointelligent lösning som kan ersätta din sed-rad är att göra en case-sats där du listar alla möjliga felstavningar du vill kunna rätta. Men det kommer ju förstås precis som med sed-raden att misslyckas så fort du stöter på en felstavning som du inte har tänkt på i förväg.

Kod: Markera allt

case "$ORD" in
felstavning1 | \
felstavning2 | \
felstavning3 )
   ORD=rättstavning1
;;
felstavning4 )
   ORD=rättstavning2
;;
esac
Användarvisningsbild
dmz
Inlägg: 3292
Blev medlem: 29 jul 2008, 19:42
OS: Arch Linux

Re: Ersätta felstavad sträng med rättstavad dito

Inlägg av dmz »

Ja nog var den iallafall snyggare. Efter att ha fyllt på med de mest frekventa felstavningar jag stöter på så lär det också bli mer och mer träffsäkert, tack!
ǁ A: Because it obfuscates the reading.
ǁ Q: Why is top posting so bad?
Skriv svar

Återgå till "Terminalforum"