GNU/Linux >> Belajar Linux >  >> Linux

Kembalikan kode sed jika tidak cocok

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

Linux
  1. Dapatkan Kode Sumber untuk Perintah Linux apa pun

  2. sed Contoh Perintah di Linux

  3. sed:perintah tidak ditemukan

  1. 8 tips untuk baris perintah Linux

  2. Contoh Perintah DNF Untuk Pemula

  3. Sintaks yang tepat untuk perintah id -r

  1. 12 Contoh Perintah IP untuk Pengguna Linux

  2. Kode pengembalian grep Linux

  3. Di mana kode sumber perintah man terbaru untuk linux?