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