Filtra le righe per modello nello script bash
Domanda
Ho due variabili, una con testo e un'altra con modelli.E voglio filtrare le linee, i modelli abbinati.Come lo posso fare?
La mia sceneggiatura è simile a questa
# get ignore files list
IGNORE=`cat ignore.txt`
# get changed files list
CHANGED=`git diff --name-only $LAST_COMMIT HEAD`
# remove files, that should be ignored from change list
for IG in $IGNORE; do
echo $CHANGED
$CHANGED=`cat $CHANGED | grep -v $IG`
done
Soluzione
Puoi fornire il file di pattern direttamente a grep
# get changed files list and remove files that should be ignored
CHANGED=$(git diff --name-only $LAST_COMMIT HEAD | grep -vf ignore.txt)
echo $CHANGED
(Consiglio l'uso $()
invece degli apici inversi.)
A proposito, questa riga:
$CHANGED=`cat $CHANGED | grep -v $IG`
probabilmente dovrebbe assomigliare a questo:
CHANGED=`echo $CHANGED | grep -v $IG`
se avessi intenzione di tenerlo.
Altri suggerimenti
# Disable globbing
set -f
# Collect variables
IGNORE=$(cat ignore.txt)
CHANGED=$(...)
# Apply each pattern in turn
for pattern in $IGNORE
do
# Reset the current list of candidates
CANDIDATES=
for candidate in $CHANGED
do
# Apply the pattern
CANDIDATES="$CANDIDATES ${candidate%$pattern}"
done
# Update the CHANGED list
CHANGED=$CANDIDATES
done
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow