Bagaimana cara mendapatkan status keluar saat menggunakan perintah sed?

11

The grepperintah memberikan keluar status keluar:

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

Tetapi saya perlu menggunakan seddan saya menyadari bahwa itu tidak memiliki status keluar:

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

Saya tahu bahwa saya harus bermain-main dengan -qopsi itu, tetapi saya belum berhasil.

Josef Klimuk
sumber
7
Perhatikan bahwa sedsebagian besar memang memiliki status keluar, hanya saja tidak melakukan apa yang Anda butuhkan di sini. Jika sedperintah gagal, misalnya, jika Anda mencoba menjalankannya pada file yang Anda tidak memiliki akses tulis atau yang tidak ada, sedakan keluar dengan status keluar non-0. Status keluar hanya menunjukkan apakah sedberhasil melakukan apa yang Anda echo "foo.bar" | sed 's/pop.*$//'perintahkan , dan dieksekusi dengan benar. Itu menghapus semua baris dengan pop. Bahwa tidak ada garis seperti itu tidak relevan, perintah masih berfungsi.
terdon
@Zanna saya akan mengirim jawaban, tetapi saya merasa ini tidak benar-benar menjawab pertanyaan. Ini hanya menjelaskan kesalahpahaman, tetapi tidak memberikan solusi yang bermanfaat seperti yang dimiliki steeldriver di bawah ini. Jadi komentar sepertinya lebih tepat.
terdon

Jawaban:

13

Anda dapat menggunakan q n untuk keluar dengan status keluar n - tetapi untuk membuatnya berguna, Anda juga perlu menggunakan beberapa Percabangan dan Kontrol Aliran :

t
cabang bersyarat (yaitu: melompat ke label) hanya jika s/// perintah telah berhasil sejak baris input terakhir dibaca atau cabang bersyarat lain diambil.

Mungkin yang terbaik adalah memilih nilai untuk n yang berbeda dari salah satu nilai status keluar standar:

Status keluar nol menunjukkan keberhasilan, dan nilai bukan nol menunjukkan kegagalan. GNU 'sed' mengembalikan nilai kesalahan status keluar berikut:

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.

Jadi misalnya

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

sedangkan

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

Jika Anda ingin menghilangkan pencetakan standar dari ruang pola, kemudian ganti qdengan Q(perhatikan bahwa itu Qadalah ekstensi GNU).

Steeldriver
sumber
1

Berikut cara mencari regex dengan sed, dan menyorot kecocokan , atau mengembalikan kode keluar (5) jika tidak ada kecocokan yang ditemukan:

Ini adalah input.txt:

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

Inilah fungsi saya untuk Mencetak semua + Sorotan yang cocok + Mengembalikan kode keluar:

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

$ sorot "lo \ | end" input.txt || echo -e "\ n * Tidak ditemukan kecocokan *"

hel lo ada
fri tersayang saya mengakhiri
sebuah lo t hal
kita akan melewati sebuah lo ng akhir

Ketika tidak ada yang cocok, itu akan mengembalikan kode keluar (5). Anda dapat menggunakannya dengan cat dan pipa | demikian juga:

$ cat input.txt | sorot "hot \ | dan" || echo -e "\ n * Tidak ditemukan kecocokan *"

Halo
, teman lama saya yang terkasih,
banyak hal yang
akan kami sampaikan sampai akhir

* Tidak ditemukan kecocokan *

Terima kasih kepada https://unix.stackexchange.com/a/405725/43233 - Saya menggunakannya + opsi berhenti sementara.

Noam Manos
sumber