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.