Saya memiliki file teks dengan data berikut dan setiap baris diakhiri dengan |END|
.
T|somthing|something|END|T|something2|something2|END|
Saya mencoba mengganti |END|
dengan \n
baris baru dengan sed.
sed 's/\|END\|/\n/g' test.txt
Tapi itu menghasilkan output yang salah seperti di bawah ini:
T
|
s
o
m
e
...
Tapi yang saya inginkan adalah ini:
T|somthing|something
T|something2|something2
Saya juga mencoba tr
. Juga tidak berhasil.
Jawaban:
Gunakan ini:
Apa yang Anda coba tidak berhasil karena sed menggunakan ekspresi reguler dasar , dan implementasi sed Anda memiliki
\|
arti operator "atau" (ekstensi umum untuk BRE), jadi apa yang Anda tulis ganti (string kosong atauEND
atau string kosong) oleh baris baru.sumber
\n
). Pertanyaannya menanyakan bagaimana cara mengganti|END|
dengan baris baru, bukan oleh\n
.Berikut ini berfungsi dengan baik untuk saya:
Perhatikan bahwa saya hanya meletakkan backslash diikuti oleh tombol enter.
sumber
\n
seperti pada jawaban AB tidak akan bekerja dengan beberapased
implementasi.\|
untuk pergantian di regexp tetapi tidak\n
berarti baris baru dalams
pengganti?Anda bisa menggunakan
awk
:-F'\\|END\\|'
setel pemisah bidang ke|END|
OFS='\n'
atur pemisah bidang ouput ke baris baru$1=$1
menyebabkanawk
merekonstruksi$0
denganOFS
sebagai pemisah bidang1
adalah nilai sebenarnya, karenaawk
mencetak seluruh jalur inputsumber
Kemungkinan lain awkperintah dan menggunakan
RS
opsinya adalah:Akan mencetak catatan tersebut (berdasarkan eparator R ecord S awk) yang tidak kosong (memiliki setidaknya satu bidang) untuk mencegah pencetakan garis kosong.
Diuji pada input ini:
Memberikan hasil ini:
Itu menghapus semua baris kosong :) Jika Anda ingin memiliki baris baru juga, ganti
$1=$1
dengan$0
dalam perintah:sumber
$1=$1
mengembun urutan kekosongan menjadi satu karakter spasi dan mengembalikan false jika bidang pertama adalah 0. Tidak masuk akal. Anda mungkin inginawk 1 RS='\\|END\\|'
atauawk NF RS='\\|END\\|'
atauawk length RS='\\|END\\|'
di sini. Perhatikan bahwa regexp RS memerlukan gawk atau mawkCara lain dengan
sed
itu tidak mencetak baris kosong:misalnya input:
keluaran:
hal yang sama dengan
ed
:sumber
Seperti yang disebutkan di sini oleh Walter Mundt , kita dapat mencapai ini menggunakan string ANSI C yang dikutip
Lihat tautan di atas di sini untuk alternatif lain.
Anda dapat menggunakan sintaks berikut juga, saya tidak yakin apakah itu berfungsi pada semua rasa Unix / Linux
sumber
Saya memiliki masalah yang sama di shell posix yang ketat saya melakukannya dalam dua lulus dengan char yang tidak digunakan
sumber