grep
Komenda daje się status wyjścia:
$echo "foo.bar" | grep -o foo
foo
$echo $?
0
$echo "foo.bar" | grep -o pop
$echo $?
1
Ale muszę użyć sed
i zdałem sobie sprawę, że nie ma statusu wyjścia:
$echo "foo.bar" | sed 's/bar.*$//'
foo.
$echo $?
0
$echo "foo.bar" | sed 's/pop.*$//'
foo.bar
$echo $?
0
Wiem, że powinienem grać z tą -q
opcją, ale mi się nie udało.
command-line
sed
Josef Klimuk
źródło
źródło
sed
pewnością ma status wyjścia, po prostu nie robi tego, czego potrzebujesz tutaj. Jeślised
polecenie nie powiedzie się, na przykład, jeśli spróbujesz uruchomić go na pliku, do którego nie masz dostępu do zapisu lub plik, który nie istnieje,sed
zakończy działanie ze statusem wyjścia innym niż 0. Status wyjścia wskazuje tylko, czysed
udało się zrobić to, co mu kazano, iecho "foo.bar" | sed 's/pop.*$//'
został poprawnie wykonany. Usunął wszystkie linie za pomocąpop
. To, że nie było takich linii, nie ma znaczenia, polecenie nadal działało.Odpowiedzi:
Możesz użyć q n, aby wyjść ze statusem wyjścia n - ale aby było to przydatne, będziesz musiał także użyć Rozgałęzienia i Kontroli Przepływu :
Prawdopodobnie najlepiej wybrać wartość n, która różni się od jednej ze standardowych wartości statusu wyjścia:
Na przykład
natomiast
Jeśli chcesz pominąć domyślne drukowanie przestrzeni wzorów, zamień
q
naQ
(zauważ, żeQ
jest to rozszerzenie GNU).źródło
Oto jak szukać wyrażenia regularnego za pomocą sed i wyróżniać dopasowania lub zwrócić kod wyjścia (5), jeśli nie znaleziono dopasowania:
To jest input.txt:
Oto moja funkcja, aby wydrukować wszystko + Dopasuj wyróżnienia + Zwróć kod wyjścia:
Gdy nie ma dopasowania, zwróci kod wyjścia (5). Możesz go używać z kotem i fajką | także:
* Nie znaleziono dopasowania *
Dzięki https://unix.stackexchange.com/a/405725/43233 - Używam go + opcja wyjścia z sed.
źródło