[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[gelöst]Re: /bin/sh: prüfen ob String1 "Wort" aus String2 enthält



On Thu, 29 Dec 2016 21:30:09 +0100
Jochen Spieker <ml@well-adjusted.de> wrote:

> Michael Lange:
> > 
> > ich will in einem Shellskript prüfen, welche "Worte" aus einem
> > String1 in einem anderen String2 enthalten sind und die nicht
> > enthaltenen aus String1 entfernen.
> 
> Das ist im Prinzip eine Mengenoperation. Das kann comm(1) sehr gut.
> Ansonsten muss man sich immer fragen, ob die Shell noch das richtige
> Werkzeug ist. Ich hänge da aber auch sehr dran.
> 
> Da comm(1) sortierte Dateien braucht, musst Du Deine Ergebnislisten
> entweder (Newline-separiert und sortiert) abspeichern, oder sie per
> Process Substitution einbinden ( Bsp: <(Kommando) ).

Ok, habe jetzt noch ein bisschen herumprobiert, der Aufruf

PKGNAMES=`comm -12 <(echo $INSTALLED_PKGS | tr " " "\n" | sort ) <(echo $PKGNAMES | tr " " "\n" | sort )`

macht wie's aussieht genau was ich suche.

Und für die Akten:
Ich habe dann auch noch ein bisschen mit der Version mit "case"
aus meinem ersten Post experimentiert und bin tatsächlich noch auf
einen Fehler gestossen: mit

    INSTALLED_PKGS="`apt-mark showmanual` `apt-mark showauto`"
    PKGS=""
    for p in $PKGNAMES; do
        case $INSTALLED_PKGS in
            *$p*)
                PKGS="$PKGS $p"
            ;;
        esac
    done
    PKGNAMES="$PKGS"

bekommt man evtl. "falsch positive"; wenn z.B. INSTALLED_PKGS "libfoo"
enthält und PKGNAMES "foo", wird "foo" fälschlicherweise nicht
aussortiert.
Das lässt sich aber leicht beheben, wenn man den Block ändert in:

    INSTALLED_PKGS=$(echo `apt-mark showauto` `apt-mark showmanual`)
    PKGS=""
    for p in $PKGNAMES; do
        case " $INSTALLED_PKGS " in
            *" $p "*)
                PKGS="$PKGS $p"
            ;;
        esac
    done
    PKGNAMES="$PKGS"

Sieht aus, als hätte ich jetzt gleich zwei gute Lösungen :)
Ich denke ich werde bei #2 bleiben, weil sie ohne externes Programm
auskommt und nicht auf bash angewiesen ist, aber trotzdem vielen
Dank für den Tipp mit comm und den Process Substitutions, das kannte
ich beides nicht und ist auf jeden Fall gut zu wissen.

Gruss, und schon mal einen schönen Rutsch ins neue Jahr!

Michael

.-.. .. ...- .   .-.. --- -. --.   .- -. -..   .--. .-. --- ... .--. . .-.

One does not thank logic.
		-- Sarek, "Journey to Babel", stardate 3842.4


Reply to: