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