GNU/Linux >> Belajar Linux >  >> Linux

sed e dan g flag tidak bekerja bersama

Bendera bekerja sama dengan cara yang berlawanan dengan yang Anda harapkan. Dokumentasi /e adalah, sebagai catatan:

Perintah ini memungkinkan seseorang untuk menyalurkan input dari perintah shell ke ruang pola. Jika substitusi dibuat, perintah yang ditemukan di ruang pola dieksekusi dan ruang pola diganti dengan keluarannya. Baris baru yang tertinggal ditekan; hasil tidak ditentukan jika perintah yang akan dieksekusi berisi karakter nol. Ini adalah ekstensi sed GNU.

Itu ditulis dengan sedikit berbelit-belit. Artinya adalah, setelah menyelesaikan s/// perintah untuk baris ini, jika ada perubahan, baris (baru) dijalankan sebagai perintah dan keluarannya digunakan sebagai pengganti baris ini.

Jadi untuk perintah yang Anda berikan:

echo AAA | sed -r 's/A/echo B/ge'

itu pertama menggantikan setiap A dengan echo B , dan lalu mengeksekusi hasilnya sebagai perintah. Ini memiliki (secara kasar) efek yang sama seperti:

echo AAA | sed -r 's/A/echo B/g' | sh

GNU sed tidak secara langsung mendukung mode yang Anda inginkan, meskipun Anda dapat memalsukannya dengan skrip yang lebih rumit jika diinginkan. Sebagai alternatif, /e Perl pengubah ke s perintah memang memiliki perilaku yang Anda cari, tetapi dengan ekspresi Perl sebagai gantinya.


Anda adalah mendapatkan banyak penggantian, tetapi Anda tidak mendapatkan banyak eksekusi. Pola dijalankan setelah semua penggantian dilakukan.

Tanpa e tandai hasil

echo AAA | sed -r 's/A/echo B/g'

adalah

echo Becho Becho B

Jadi itulah baris perintah yang dijalankan jika Anda melakukannya sertakan e bendera, yang setara dengan

echo 'Becho Becho B'

Untuk mendapatkan 'BBB' dari 'AAA' menggunakan perintah 's' GNU sed dengan bendera 'e', ​​seseorang dapat melakukan ini:

echo AAA | sed -re 's/A/echo -n B;/ge'

'AAA' diganti dengan 'echo -n B;echo -n B; echo -n B;', yang, ketika akhirnya dieksekusi, mengarah ke 3 perintah gema yang berjalan secara berurutan, satu untuk setiap kecocokan global. '-n' menghilangkan karakter umpan baris dari keluaran gema, membuat 'B berakhir pada satu baris (tetapi sed menambahkan satu umpan baris dengan sendirinya saat akhirnya mencetak ruang pola).


Linux
  1. id:perintah tidak ditemukan

  2. w:perintah tidak ditemukan

  3. df:perintah tidak ditemukan

  1. du:perintah tidak ditemukan

  2. Mendapatkan sudo dan nohup untuk bekerja bersama

  3. Mengapa sudo:perintah bundel tidak ditemukan?

  1. Perintah Linux 'akan' tidak berfungsi

  2. Perintah Conda bekerja di command prompt tetapi tidak di skrip bash

  3. gema karakter baris baru tidak berfungsi di bash