Jalankan perintah dalam 'sed'

9

Saya memiliki daftar alamat memori acak yang disimpan dalam file teks, dan saya harus sedmengeluarkannya, mendekodekannya, dan menyimpannya kembali ke file saya. Namun, operasi decoding yang saya coba lakukan ditangani dalam program C ++ yang saya buat beberapa waktu lalu. Masalah yang saya temui sekarang adalah mengeksekusi C ++ dalam sedperintah; yaitu, saya ingin kembali merujuk bagian yang perlu diterjemahkan dan menggunakannya sebagai argumen dalam program C ++ saya. Saya telah menulis perintah berikut:

cat $1 | sed -r 's/(0[Xx])([0-9A-Za-z]{1,8})/\1`./convAddrs \2`/g';

sebelumnya saya sempat membaca jawaban di postingan ini yang mengatakan bahwa sedTIDAK menjalankan perintah. Benarkah itu sedtidak memungkinkan eksekusi perintah? Jika demikian, dengan asumsi perintah yang saya tulis adalah sedurutan yang valid , bagaimana saya akan menuliskannya perl?

Fadi Hanna AL-Kass
sumber
tautan ditambahkan. saya buruk :)
Fadi Hanna AL-Kass

Jawaban:

8
perl -pe 's|(?<=0x)[0-9a-f]{1,8}|`./convAddrs $&`|gei'
  • perl -pe: seperti sed: memproses input satu baris pada satu waktu $_, mengevaluasi perl [e] xpression yang diteruskan ke -euntuk setiap baris dan [p] memecah yang dimodifikasi $_untuk masing-masing.
  • s|X|Y|gei: Pengganti Yuntuk Xdi $_([g] lobally, kasus [i] nsensitively, dan memperlakukan Ysebagai perl [e] Xpression bukan string dasar).
  • (?<=0x): lihat di belakang 0x.
  • [0-9a-f]{1,8}: satu hingga 8 digit hex, sebanyak mungkin
  • `./convAddrs $&`: ganti dengan output dari baris perintah shell di mana $&digantikan oleh bagian yang cocok.
Stéphane Chazelas
sumber
Saya mendapatkan kesalahan berikut ketika menjalankan perintah Anda: Tidak memiliki ruang antara pola dan kata berikut tidak digunakan lagi di -e 1. Pengubah regexp "/ a" dan "/ d" saling eksklusif di -e baris 1, pada akhirnya pengubah garis Regexp "/ a" dan "/ d" saling eksklusif di -e baris 1, di akhir jalur Tidak dapat menemukan string terminator "` "di mana pun sebelum EOF di -e baris 1.
Fadi Hanna AL-Kass
1
Tentu saja, maaf saya salah, Anda perlu mengganti pemisah karena kami tidak dapat menggunakan di /sini karena digunakan di dalam bagian pengganti. Dikoreksi.
Stéphane Chazelas
Sial, dan saya pikir saya cukup bagus di Perl one liners, +1!
terdon
2

Mungkin benar atau tidak benar yang sedtidak dapat menjalankan perintah. Itu tidak benar untuk GNU sed:

sed -Ee 's/(0[Xx])([0-9A-Za-z]{1,8})/\1\n ./convAddrs \2\n#/g' \
-eh -e  's/\n.//gp;g;s/^/#/e' <"$1"

Tidak jelas bagi saya apa lagi yang mungkin ada dalam <$1masukan Anda , jadi saya berhati-hati untuk #mengomentari apa pun yang tidak ada command \2dalam ruang pola. Ketika Anda menggunakan eflag xecute GNU pada suatu s///ubstitusi, ia melewatkan seluruh ruang pola yang dihasilkan $SHELL -csebagai argumen kedua, dan kemudian menggantikan semua ruang pola dengan apa pun yang ditulis ke $SHELLstdout itu. Jadi saya di atas saya mencetak apa pun hasil Anda sebelumnya, dan kemudian setelah hasil melewati command-line ke shell.

mikeserv
sumber