seperti yang dikomentari @cnicutar, kode kembalian dari suatu perintah berarti jika perintah itu berhasil dijalankan. tidak ada hubungannya dengan logika yang Anda terapkan dalam kode/skrip.
jadi jika Anda memiliki:
echo "foo"|sed '/bar/ s/a/b/'
sed akan mengembalikan 0
tetapi jika Anda menulis beberapa kesalahan sintaks/ekspresi, atau input/file tidak ada, sed tidak dapat menjalankan permintaan Anda, sed akan mengembalikan 1.
solusi
ini sebenarnya bukan solusi . sed memiliki q
perintah:(dari halaman manual):
q [exit-code]
di sini Anda dapat menentukan kode keluar seperti yang Anda inginkan. Misalnya '/foo/!{q100}; {s/f/b/}'
akan keluar dengan kode 100 jika foo
tidak ada, dan lakukan substitusi f->b dan keluar dengan kode 0.
Kasus yang cocok:
kent$ echo "foo" | sed '/foo/!{q100}; {s/f/b/}'
boo
kent$ echo $?
0
Kasus yang tidak cocok:
kent$ echo "trash" | sed '/foo/!{q100}; {s/f/b/}'
trash
kent$ echo $?
100
Saya harap ini menjawab pertanyaan Anda.
edit
Saya harus menambahkan bahwa, contoh di atas hanya untuk pemrosesan satu baris. Saya tidak tahu persis kebutuhan Anda. ketika Anda ingin mendapatkan exit 1
. satu baris tak tertandingi atau seluruh file. Jika seluruh file kasus tidak cocok, Anda dapat mempertimbangkan awk, atau bahkan melakukan grep
sebelum pemrosesan teks Anda...
Ini mungkin berhasil untuk Anda (GNU sed):
sed '/search-string/{s//replacement-string/;h};${x;/./{x;q0};x;q1}' file
Jika search-string
ditemukan akan diganti dengan replacement-string
dan di akhir file sed
akan keluar dengan 0
kode pengembalian. Jika tidak ada substitusi, kode kembaliannya adalah 1
.
Penjelasan lebih detail:
Dalam sed, pengguna memiliki dua register yang dapat digunakannya:ruang pola (PS) tempat baris saat ini dimuat (minus umpan baris) dan register cadangan yang disebut ruang tunggu (HS) yang awalnya kosong.
Ide umumnya adalah menggunakan HS sebagai bendera untuk menunjukkan jika pergantian telah terjadi. Jika HS masih kosong di akhir file, maka tidak ada perubahan yang dilakukan, jika tidak, perubahan telah terjadi.
Perintah /search-string/
cocok dengan search-string
dengan apa pun yang ada di PS dan jika ditemukan mengandung search-string
perintah di antara kurung kurawal berikut dijalankan.
Pertama substitusi s//replacement-string/
(sed menggunakan regexp terakhir yaitu search-string
, jika sisi kiri kosong, jadi s//replacement-string
sama dengan s/search-string/replacement-string/
) dan ikuti ini h
perintah membuat salinan PS dan meletakkannya di HS.
Perintah sed $
digunakan untuk mengenali baris terakhir dari sebuah file dan hal berikut akan terjadi.
Pertama x
perintah menukar dua register, sehingga HS menjadi PS dan PS menjadi HS.
Kemudian PS dicari karakter apa saja /./
(.
artinya cocok dengan karakter apa saja) ingat HS (sekarang PS) awalnya kosong sampai terjadi pergantian pemain. Jika kondisi benar, x
lagi dieksekusi diikuti oleh q0
perintah yang mengakhiri semua pemrosesan sed dan menetapkan kode pengembalian ke 0
. Kalau tidak, x
perintah dijalankan dan kode pengembalian diatur ke 1
.
N.B. meskipun q
berhenti memproses sed itu tidak mencegah PS dipasang kembali oleh sed dan dicetak seperti biasa.
Alternatif lain:
sed '/search-string/!ba;s//replacement-string/;h;:a;$!b;p;x;/./Q;Q1' file
atau:
sed '/search-string/,${s//replacement-string/;b};$q1' file
Semua jawaban ini terlalu rumit. Apa yang salah dengan menulis sedikit skrip shell yang menggunakan grep untuk mencari tahu apakah ada hal yang ingin Anda ganti lalu gunakan sed untuk menggantinya?
grep -q $TARGET_STRING $file
if [ $? -eq 0 ]
then
echo "$file contains the old site"
sed -e "s|${TARGET_STRING}|${NEW_STRING}|g" ....
fi