GNU/Linux >> Linux Esercitazione >  >> Linux

Restituisce il codice di sed per nessuna corrispondenza

come ha commentato @cnicutar, il codice di ritorno di un comando indica se il comando è stato eseguito correttamente. non ha nulla a che fare con la logica che hai implementato nei codici/script.

quindi se hai:

echo "foo"|sed '/bar/ s/a/b/'

sed restituirà 0 ma se scrivi alcuni errori di sintassi/espressione o l'input/file non esiste, sed non può eseguire la tua richiesta, sed restituirà 1.

soluzione alternativa

questa in realtà non è una soluzione alternativa . sed ha q comando:(dalla pagina man):

 q [exit-code]

qui puoi definire il codice di uscita come desideri. Ad esempio '/foo/!{q100}; {s/f/b/}' uscirà con il codice 100 se foo non è presente, altrimenti esegui la sostituzione f->be esci con il codice 0.

Caso corrispondente:

kent$  echo "foo" | sed  '/foo/!{q100}; {s/f/b/}'
boo
kent$  echo $?
0

Caso senza corrispondenza:

kent$ echo "trash" | sed  '/foo/!{q100}; {s/f/b/}'
trash
kent$ echo $?
100

Spero che questo risponda alla tua domanda.

modifica

Devo aggiungere che l'esempio sopra è solo per l'elaborazione di una riga. Non conosco la tua esatta esigenza. quando vuoi ottenere exit 1 . una riga senza corrispondenza o l'intero file. Se l'intero file non corrisponde a maiuscole e minuscole, puoi considerare awk o persino eseguire un grep prima dell'elaborazione del testo...


Questo potrebbe funzionare per te (GNU sed):

sed '/search-string/{s//replacement-string/;h};${x;/./{x;q0};x;q1}' file

Se search-string viene trovato verrà sostituito con replacement-string e alla fine del file sed uscirà con 0 codice di ritorno. Se non avviene alcuna sostituzione, il codice di ritorno sarà 1 .

Una spiegazione più dettagliata:

In sed l'utente ha a disposizione due registri:il pattern space (PS) in cui viene caricata la riga corrente (meno il linefeed) e un registro di riserva chiamato hold space (HS) che inizialmente è vuoto.

L'idea generale è di usare l'HS come indicatore per indicare se è avvenuta una sostituzione. Se l'HS è ancora vuoto alla fine del file, non sono state apportate modifiche, altrimenti si sono verificate modifiche.

Il comando /search-string/ corrisponde a search-string con tutto ciò che è nel PS e se si trova che contiene il search-string vengono eseguiti i comandi tra le seguenti parentesi graffe.

Innanzitutto la sostituzione s//replacement-string/ (sed usa l'ultima espressione regolare, cioè il search-string , se il lato sinistro è vuoto, quindi s//replacement-string è uguale a s/search-string/replacement-string/ ) e successivamente il h Il comando crea una copia del PS e lo inserisce nell'HS.

Il comando sed $ viene utilizzato per riconoscere l'ultima riga di un file e quindi si verifica quanto segue.

Prima il x Il comando scambia i due registri, quindi HS diventa PS e PS diventa HS.

Quindi il PS viene cercato per qualsiasi carattere /./ (. significa corrispondere a qualsiasi carattere) ricorda che HS (ora PS) era inizialmente vuoto fino a quando non è avvenuta una sostituzione. Se la condizione è vera il x viene nuovamente eseguito seguito da q0 comando che termina tutta l'elaborazione sed e imposta il codice di ritorno su 0 . Altrimenti x viene eseguito il comando e il codice di ritorno è impostato su 1 .

N.B. sebbene il q chiude l'elaborazione di sed non impedisce al PS di essere riassemblato da sed e stampato come di consueto.

Un'altra alternativa:

sed '/search-string/!ba;s//replacement-string/;h;:a;$!b;p;x;/./Q;Q1' file

oppure:

sed '/search-string/,${s//replacement-string/;b};$q1' file

Queste risposte sono fin troppo complicate. Cosa c'è di sbagliato nello scrivere un po' di script di shell che usa grep per capire se la cosa che vuoi sostituire è lì e poi usare sed per sostituirla?

grep -q $TARGET_STRING $file
if [ $? -eq 0 ]
then
    echo "$file contains the old site"
    sed -e "s|${TARGET_STRING}|${NEW_STRING}|g" ....
fi

Linux
  1. Ottieni il codice sorgente per qualsiasi comando Linux

  2. Esempi di comandi sed in Linux

  3. sed:comando non trovato

  4. Sintassi corretta per il comando id -r

  5. Dov'è l'ultimo codice sorgente del comando man per Linux?

Linux nl Command Tutorial per principianti (7 esempi)

Tutorial sui comandi Linux nm per principianti (10 esempi)

Esercitazione sui comandi OD Linux per principianti (6 esempi)

Linux w Command Tutorial per principianti (5 esempi)

Tutorial sui comandi Linux ss per principianti (8 esempi)

Exa:un sostituto moderno per ls Command