Differenza stringa Bash


70

Sto cercando di trovare un modo per determinare la differenza tra due stringhe nel mio script. Potrei facilmente farlo con diff o comm, ma non ho a che fare con i file e preferirei non visualizzarli su file, fare il confronto e rileggerli.

Vedo che comm, diff, cmp consentono tutti di passare due file O un file e uno standard input - Suppongo che sia buono se non voglio produrre due file ... ma è ancora un po 'schifoso.

State scavando intorno pensando di poter usare grep o espressioni regolari - ma immagino di no.

Grazie in anticipo,

+1

che cosa è che si vuole realmente fare? 18 gen. 092009-01-18 02:51:04

  0

È possibile utilizzare le manipolazioni della sottostringa e le operazioni di test incorporate con le modifiche IFS da confrontare, ma è necessario sapere se si desidera confrontare carattere per carattere, parola per parola, riga per riga, ignorare lo spazio bianco ... 21 lug. 122012-07-21 10:33:51

9

mi ricorda questa domanda: How can you diff two pipelines in Bash?

Se si è in una sessione di bash, si potrebbe fare un:

diff <cmd1 <cmd2 
diff <(foo | bar) <(baz | quux) 

con < creazione named pipe anonimi - - gestito da bash - quindi vengono creati e distrutti automaticamente, a differenza dei file temporanei.

Quindi, se si riesce a isolare il due stringa differente come parte di un comando (grep, awk, sed, ...), si può fare - per esempio - qualcosa di simile:

diff < grep string1 myFile < grep string2 myFile 

(se si supponga di avere nelle vostre linee di file come string1=very_complicated_value e un string2=another_long_and_complicated_value': senza conoscere il formato interno del file, non posso raccomandare un comando preciso)


124

Utilizzando diff o com o quello che volete:

diff <(echo "$string1") <(echo "$string2") 

di Greg Bash FAQ: Process Substitution

o con un named pipe

mkfifo ./p 
diff - p <<< "$string1" & echo "$string2" > p 

di Greg Bash FAQ: Working with Named Pipes

named pipe è anche conosciuto come un FIFO.

Il - da solo è per input standard.

<<< è una "stringa qui".

& è come ; ma mette in background

+3

+1 per la risposta corretta. +1 per una grande spiegazione dei simboli. Inoltre, le domande frequenti di Greg's Bash sono state spostate su: http://mywiki.wooledge.org/ I collegamenti per le pagine precedenti sono ora disponibili su http://mywiki.wooledge.org/ProcessSubstitution e http://mywiki.wooledge.org/ BashFAQ/085 20 feb. 132013-02-20 17:30:24

  0

thx! e inoltre, questo mostrerà i descrittori di file dinamici 'FUNC() {echo" $ @ "; "$ @"; }; FUNC diff <(echo a) <(echo b); ' 16 apr. 152015-04-16 01:30:54

  0

Stavo cercando quello per il confronto di due shasum. Non sono sicuro se c'è un modo più elegante per farlo, ma funziona. 23 ago. 162016-08-23 08:29:09

  0

Sembra funzionare se ci sono più righe in $ stringa1 e $ stringa2 e diff restituisce le righe aggiunte o sottratte. Cosa succede se la stringa è una singola riga e linea e c'è qualche differenza tra le due stringhe? 10 ago. 172017-08-10 15:28:00


11

preferisco cmp e Processo funzione di sostituzione di bash:

$ cmp -bl <(echo -n abcda) <(echo -n aqcde) 
    2 142 b 161 q 
    5 141 a 145 e 

Dire in posizione 2, ab si verifica per la prima, ma aq per la secondo. Alla posizione 5, sta accadendo un'altra differenza. Sostituisci semplicemente quelle stringhe in base alle variabili e il gioco è fatto.

  0

Funziona solo quando le stringhe sono della stessa lunghezza! 06 mag. 162016-05-06 11:58:04


8

Diciamo che sono tre corde

a="this is a line" 
b="this is" 
c="a line" 

Per rimuovere il prefisso b da un

echo ${a#"$b"} 

Per rimuovere il suffisso c da un

echo ${a%"$c"} 
+1

Immagino che questo sia il modo bash di farlo. Ha funzionato bene. Questa sintassi però è un po 'difficile da capire. 05 nov. 142014-11-05 20:39:25

  0

@MikaelRoos Concordato. Più facile da leggere (per me comunque) sarebbe usare sed: 'echo" $ a "| sed "s!^$ b !! g" '(Ho scambiato lo standard sed separator/for! nel caso in cui le variabili trattate siano percorsi. Inoltre, potresti usare una stringa here invece di echo:' sed ... <<< $ a'.) 08 set. 162016-09-08 18:06:40