Hai, saya perlu menggabungkan tiga baris berturut-turut dengan swap antara baris ke-2 dan ke-3 di 'file':
$cat file
Object Name: A
comments: comment A
manual_encdomain: Name: A
Object Name: B
comments: comment B
manual_encdomain: Name: B
Jadi alih-alih output di bawah ini :
$sed 'N;N;s/n/ /g' file
Object Name: A comments: comment A manual_encdomain: Name: A
Object Name: B comments: comment B manual_encdomain: Name: B
Saya lebih suka ini
Object Name: A manual_encdomain: Name: A comments: comment A
Object Name: B manual_encdomain: Name: B comments: comment B
sed, awk apa saja
Jawaban yang Diterima:
Ya, Anda dapat menggunakan sed untuk menukar baris:
$ sed -E 'N;N;s/n([^n]*)n([^n]*)/ 2 1/' file
Object Name: A manual_encdomain: Name: A comments: comment A
Object Name: B manual_encdomain: Name: B comments: comment B
Atau, secara setara:
$ sed 'N;N;s/n([^n]*)n([^n]*)/ 2 1/g' file
Object Name: A manual_encdomain: Name: A comments: comment A
Object Name: B manual_encdomain: Name: B comments: comment B
Cara kerjanya:
-
-E
Ini mengaktifkan ekspresi reguler yang diperluas. (
-E
bekerja pada sed BSD (OSX) dan sed GNU modern. Untuk versi GNU sed yang lebih lama, gunakan-r
sebagai gantinya.)Tanpa regex yang diperluas, kita harus keluar dari
(
dan)
seperti yang ditunjukkan di atas. -
N;N
Ini dibaca di baris kedua dan ketiga.
-
s/n([^n]*)n([^n]*)/ 2 1/
Ini menukar baris kedua dan ketiga. Kemunculan pertama
n([^n]*)
menangkap baris kedua dan menyimpannya di grup tangkap 1. Kemunculan keduan([^n]*)
menangkap baris ketiga dan menyimpannya di grup tangkap 2. Teks pengganti,2 1
menukar posisi sambil mengganti baris baru dengan spasi.
Menghapus beberapa ruang putih berlebih
Baris kedua dan ketiga diindentasi dalam file input. Jika kita ingin menghapus spasi ekstra itu:
$ sed -E 'N;N;s/n[[:blank:]]*([^n]*)n[[:blank:]]*([^n]*)/ 2 1/g' file
Object Name: A manual_encdomain: Name: A comments: comment A
Object Name: B manual_encdomain: Name: B comments: comment B
[[:blank:]]
adalah cara aman-unicode untuk mencocokkan kosong dan tab.