Sed komutunu kullanırken çıkış durumunu nasıl edinebilirim?


11

grepKomut çıkış durumları verir:

$echo "foo.bar" | grep -o foo
foo
$echo $?
0
$echo "foo.bar" | grep -o pop
$echo $?
1  

Ama kullanmam gerekiyor sedve çıkış durumu olmadığını fark ettim:

$echo "foo.bar" | sed 's/bar.*$//'
foo.
$echo $?
0
$echo "foo.bar" | sed 's/pop.*$//'
foo.bar
$echo $?
0  

Bu -qseçenekle oynamam gerektiğini biliyorum , ama başaramadım.


7
sedKesinlikle bir çıkış durumu olduğunu unutmayın, burada ihtiyacınız olanı yapmaz. Eğer sedkomut başarısız bir dosya üzerinde çalıştırmak çalışırsanız, örneğin, sen yazma erişimi veya yok bir yok sedolmayan bir 0 çıkış durumu ile çıkılacak. Çıkış durumu, yalnızca sedsize söylediklerinizi yapmayı başarabildiğini ve echo "foo.bar" | sed 's/pop.*$//'doğru bir şekilde yürütüldüğünü gösterir. İle tüm satırları sildi pop. Bu tür hatların alakasız olması, komut hala işe yaradı.
— terdon

@Zanna Bir cevap gönderecektim, ama bunun aslında soruyu cevaplamadığını hissettim. Sadece bir yanlış anlama açıklar, ancak steeldriver'ın aşağıda olduğu gibi yararlı bir çözüm sağlamaz. Yani bir yorum daha uygun görünüyordu.
— terdon

Yanıtlar:


13

Sen q kullanabilirsiniz n çıkış durumu ile çıkmak için n - ama bu kullanışlı hale getirmek için, ayrıca bazı kullanmanız gerekecektir Dallanma ve Akış Kontrolü :

t
dallı koşullu (yani bir etikete atla) yalnızca s/// son giriş satırı okunduğundan beri bir komut başarılı olduysa veya başka bir koşullu dal alındıysa.

N için , standart çıkış durumu değerlerinden birinden farklı bir değer seçmek en iyisidir :

Sıfır çıkış durumu başarıyı, sıfır olmayan bir değer ise başarısızlığı belirtir. GNU 'sed' aşağıdaki çıkış durumu hata değerlerini döndürür:

0
 Successful completion.

1
 Invalid command, invalid syntax, invalid regular expression or a
 GNU 'sed' extension command used with '--posix'.

2
 One or more of the input file specified on the command line could
 not be opened (e.g.  if a file is not found, or read permission is
 denied).  Processing continued with other files.

4
 An I/O error, or a serious processing error during runtime, GNU
 'sed' aborted immediately.

Yani mesela

$ echo "foo.bar" | sed 's/bar.*$//; t; q42' ; echo $? 
foo.
0

buna karşılık

$ echo "foo.bar" | sed 's/baz.*$//; t; q42' ; echo $? 
foo.bar
42

Eğer desen alanının baskı varsayılan ihmal etmek istiyorsanız, o zaman değiştirin qtarafından Q(not Qbir GNU).


1

Normal ifadeyi sed ile nasıl arayacağınız ve eşleşmeleri vurgulayacağınız veya hiçbir eşleşme bulunmazsa çıkış kodunu (5) nasıl döndüreceğiniz aşağıda açıklanmıştır :

Bu input.txt'dir:

hello there
my dear old friend
a lot of things
we'll pass along the end

İşte tüm Yazdır + Eşleşmeleri vurgula + Çıkış kodunu döndür işlevim:

highlight()
{
  pattern=$1
  shift
  sed '/'"${pattern}"'/,${s//\x1b[32m&\x1b[0m/g;b};$q5' "$@"
}

$ vurgula "lo \ | end" input.txt || echo -e "\ n * Eşleşme bulunamadı *"

hel lo orada
benim sevgili eski fri son
bir lot şey
biz we pass geçmek bir long the son

Eşleşme olmadığında çıkış kodu (5) döndürülür. Sen edebilirsiniz | kedi ve boruyla kullanabilirsiniz ayrıca:

$ cat input.txt | "sıcak \ | ve" || echo -e "\ n * Eşleşme bulunamadı *"

merhaba
sevgili eski dostum sonunda geçeceğimiz
bir çok şey

* Eşleşme bulunamadı *

Sayesinde https://unix.stackexchange.com/a/405725/43233 - Ben + sed kullanıyorum seçeneği çıkın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.