jak poznamenal @cnicutar, návratový kód příkazu znamená, zda byl příkaz úspěšně proveden. nemá nic společného s logikou, kterou jste implementovali v kódech/skriptech.
takže pokud máte:
echo "foo"|sed '/bar/ s/a/b/'
sed vrátí 0
ale pokud napíšete nějaké chyby syntaxe/výrazu nebo vstup/soubor neexistuje, sed nemůže vykonat váš požadavek, sed vrátí 1.
řešení
toto ve skutečnosti není řešení . sed má q
příkaz:(z manuálové stránky):
q [exit-code]
zde můžete definovat výstupní kód, jak chcete. Například '/foo/!{q100}; {s/f/b/}'
ukončí se s kódem 100, pokud foo
není přítomen a jinak proveďte substituci f->b a ukončete s kódem 0.
Odpovídající případ:
kent$ echo "foo" | sed '/foo/!{q100}; {s/f/b/}'
boo
kent$ echo $?
0
Nesrovnatelný případ:
kent$ echo "trash" | sed '/foo/!{q100}; {s/f/b/}'
trash
kent$ echo $?
100
Doufám, že to odpoví na vaši otázku.
upravit
Musím dodat, že výše uvedený příklad je pouze pro jednořádkové zpracování. Neznám váš přesný požadavek. když chcete získat exit 1
. jednořádkový neshodný nebo celý soubor. Pokud celý soubor neodpovídá velikosti písmen, můžete zvážit awk nebo dokonce provést grep
před zpracováním textu...
Toto by vám mohlo fungovat (GNU sed):
sed '/search-string/{s//replacement-string/;h};${x;/./{x;q0};x;q1}' file
Pokud search-string
bude nahrazeno replacement-string
a na konci souboru sed
ukončí se s 0
návratový kód. Pokud nedojde k žádné náhradě, návratový kód bude 1
.
Podrobnější vysvětlení:
V sed má uživatel k dispozici dva registry:prostor vzorů (PS), do kterého je načten aktuální řádek (minus posun řádku) a náhradní registr nazývaný úložný prostor (HS), který je zpočátku prázdný.
Obecnou myšlenkou je použít HS jako příznak k označení, zda došlo k substituci. Pokud je HS na konci souboru stále prázdný, pak nebyly provedeny žádné změny, jinak došlo ke změnám.
Příkaz /search-string/
odpovídá search-string
s čímkoli, co je v PS, a pokud se zjistí, že obsahuje search-string
jsou provedeny příkazy mezi následujícími složenými závorkami.
Nejprve substituce s//replacement-string/
(sed používá poslední regulární výraz, tj. search-string
, pokud je levá strana prázdná, tak s//replacement-string
je stejný jako s/search-string/replacement-string/
) a následuje h
příkaz vytvoří kopii PS a vloží ji do HS.
Příkaz sed $
se používá k rozpoznání posledního řádku souboru a následuje následující.
Nejprve x
příkaz prohodí dva registry, takže HS se stane PS a PS se stane HS.
Poté se v PS vyhledá jakýkoli znak /./
(.
prostředky odpovídají libovolnému znaku) pamatujte, že HS (nyní PS) bylo zpočátku prázdné, dokud nedošlo k nahrazení. Pokud je podmínka pravdivá, x
se znovu provede a následuje q0
příkaz, který ukončí veškeré zpracování sed a nastaví návratový kód na 0
. Jinak x
je proveden příkaz a návratový kód je nastaven na 1
.
N.B. ačkoli q
ukončí zpracování sed, nezabrání tomu, aby se PS znovu sestavil a vytiskl jako normálně.
Další alternativa:
sed '/search-string/!ba;s//replacement-string/;h;:a;$!b;p;x;/./Q;Q1' file
nebo:
sed '/search-string/,${s//replacement-string/;b};$q1' file
Všechny tyto odpovědi jsou příliš složité. Co je špatného na napsání malého skriptu shellu, který používá grep k tomu, aby zjistil, zda věc, kterou chcete nahradit, je tam, a pak pomocí sed k jejímu nahrazení?
grep -q $TARGET_STRING $file
if [ $? -eq 0 ]
then
echo "$file contains the old site"
sed -e "s|${TARGET_STRING}|${NEW_STRING}|g" ....
fi