Saya mencoba menemukan cara untuk menentukan perbedaan antara dua string dalam skrip saya. Saya dapat dengan mudah melakukan ini dengan diff atau comm, tetapi saya tidak berurusan dengan file dan saya lebih suka untuk tidak menampilkannya ke file, melakukan perbandingan dan membacanya kembali.
Saya melihat bahwa comm, diff, cmp semuanya memungkinkan untuk melewatkan dua file ATAU file dan input standar - saya rasa itu bagus jika saya tidak ingin mengeluarkan dua file ... tapi masih agak menyebalkan.
Telah menggali sekitar berpikir saya bisa menggunakan grep atau ekspresi reguler - tapi saya rasa tidak.
Jawaban:
Menggunakan
diff
ataucom
atau apapun yang Anda inginkan:Tanya Jawab Greg's Bash: Pergantian Proses
atau dengan pipa bernama
Greg's Bash FAQ: Bekerja dengan Named Pipes
Pipa bernama juga dikenal sebagai FIFO.
The
-
sendiri adalah untuk input standar.<<<
adalah "string di sini".&
seperti;
tetapi meletakkannya di latar belakangsumber
FUNC(){ echo "$@"; "$@"; }; FUNC diff <(echo a) <(echo b);
$ diff <(echo "Here are the letters in String One.") <(echo "Here are the characters in String Two.")
\n
1c1
\n
< Here are the letters in String One.
\n
---
\n
> Here are the characters in String Two.
\n
Menggunakan pipa serupa, kecuali itu menunjukkan nomor proses, dimulai dengan1c1
setelah berikutnya$
, dan menunggu sampai Anda menekan <kbd> Enter <kbd> (atau Anda dapat melakukan perintah lain ...)Mengingatkan saya pada pertanyaan ini: Bagaimana Anda bisa membedakan dua jalur pipa di Bash?
Jika Anda berada dalam sesi bash, Anda bisa melakukan:
dengan
<
membuat pipa bernama anonim - dikelola oleh bash - sehingga dibuat dan dihancurkan secara otomatis, tidak seperti file sementara.Jadi jika Anda berhasil mengisolasi dua string berbeda sebagai bagian dari perintah (grep, awk, sed, ...), Anda dapat melakukan - misalnya - sesuatu seperti:
(jika Anda mengira Anda memiliki baris file seperti
string1=very_complicated_value
danstring2=another_long_and_complicated_value'
: tanpa mengetahui format internal file Anda, saya tidak dapat merekomendasikan perintah yang tepat)sumber
Saya lebih suka
cmp
dan fitur Proses Substitusi bash:Mengatakan pada posisi 2, ab muncul untuk yang pertama, tetapi aq untuk yang kedua. Di posisi 5, perbedaan lain terjadi. Cukup ganti string tersebut dengan variabel, dan Anda selesai.
sumber
Katakanlah Anda memiliki tiga senar
Untuk menghapus prefiks b dari a
Untuk menghapus sufiks c dari a
sumber
echo "$a" | sed "s!^$b!!g"
(Saya menukar pemisah sed standar / untuk! Jika variabel yang ditangani adalah jalur. Selain itu, Anda dapat menggunakan string di sini daripada echo:.sed ... <<< $a
)Contoh lain:
Keluaran
Jawaban asli di sini
sumber