GNU/Linux >> Znalost Linux >  >> Linux

Návratový kód sed pro žádnou shodu

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

Linux
  1. Získejte zdrojový kód pro jakýkoli příkaz Linux

  2. Návratový kód grep pro Linux

  3. Kde je nejnovější zdrojový kód příkazu man pro linux?

  1. 8 tipů pro příkazový řádek Linuxu

  2. Příklady příkazů DNF pro začátečníky

  3. Příklady příkazů sed v Linuxu

  1. 12 Příklady IP příkazů pro uživatele Linuxu

  2. sed:příkaz nenalezen

  3. Správná syntaxe příkazu id -r