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:
-
-EIni mengaktifkan ekspresi reguler yang diperluas. (
-Ebekerja pada sed BSD (OSX) dan sed GNU modern. Untuk versi GNU sed yang lebih lama, gunakan-rsebagai gantinya.)Tanpa regex yang diperluas, kita harus keluar dari
(dan)seperti yang ditunjukkan di atas. -
N;NIni 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 1menukar 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.