Berikut ini akan mencetak baris yang cocok TERMINATE
sampai akhir file:
sed -n -e '/TERMINATE/,$p'
Dijelaskan: -n
menonaktifkan perilaku default sed
pencetakan setiap baris setelah mengeksekusi skripnya di atasnya, -e
menunjukkan skrip untuk sed
, /TERMINATE/,$
adalah pilihan kisaran alamat (baris) yang berarti baris pertama yang cocok dengan TERMINATE
ekspresi reguler (seperti grep) ke akhir file ( $
) , dan p
merupakan perintah cetak yang mencetak baris saat ini.
Ini akan mencetak dari baris yang mengikuti baris yang cocok TERMINATE
sampai akhir file:
(dari SETELAH baris yang cocok ke EOF, BUKAN termasuk baris yang cocok)
sed -e '1,/TERMINATE/d'
Dijelaskan: 1,/TERMINATE/
adalah pilihan rentang alamat (baris) yang berarti baris pertama untuk input ke baris 1 yang cocok dengan TERMINATE
ekspresi reguler, dan d
merupakan perintah hapus yang menghapus baris saat ini dan melompat ke baris berikutnya. Karena sed
perilaku default adalah untuk mencetak garis, itu akan mencetak garis setelah TERMINATE
ke akhir input.
Edit:
Jika Anda ingin garis sebelumnya TERMINATE
:
sed -e '/TERMINATE/,$d'
Dan jika Anda ingin kedua baris sebelum dan sesudah TERMINATE
dalam 2 file berbeda dalam satu pass:
sed -e '1,/TERMINATE/w before
/TERMINATE/,$w after' file
File sebelum dan sesudah akan berisi baris dengan terminate, jadi untuk memproses setiap yang Anda butuhkan:
head -n -1 before
tail -n +2 after
Sunting2:
JIKA Anda tidak ingin membuat kode nama file dalam skrip sed, Anda dapat:
before=before.txt
after=after.txt
sed -e "1,/TERMINATE/w $before
/TERMINATE/,\$w $after" file
Tapi kemudian Anda harus melarikan diri dari $
makna baris terakhir sehingga shell tidak akan mencoba untuk memperluas $w
variabel (perhatikan bahwa kami sekarang menggunakan tanda kutip ganda di sekitar skrip alih-alih tanda kutip tunggal).
Saya lupa mengatakan bahwa baris baru penting setelah nama file dalam skrip sehingga mereka tahu bahwa nama file berakhir.
Edit: 2016-0530
Sébastien Clément bertanya: "Bagaimana Anda mengganti hardcoded TERMINATE
dengan variabel?"
Anda akan membuat variabel untuk teks yang cocok dan kemudian melakukannya dengan cara yang sama seperti contoh sebelumnya:
matchtext=TERMINATE
before=before.txt
after=after.txt
sed -e "1,/$matchtext/w $before
/$matchtext/,\$w $after" file
untuk menggunakan variabel untuk teks yang cocok dengan contoh sebelumnya:
## Print the line containing the matching text, till the end of the file:
## (from the matching line to EOF, including the matching line)
matchtext=TERMINATE
sed -n -e "/$matchtext/,\$p"
## Print from the line that follows the line containing the
## matching text, till the end of the file:
## (from AFTER the matching line to EOF, NOT including the matching line)
matchtext=TERMINATE
sed -e "1,/$matchtext/d"
## Print all the lines before the line containing the matching text:
## (from line-1 to BEFORE the matching line, NOT including the matching line)
matchtext=TERMINATE
sed -e "/$matchtext/,\$d"
Poin penting tentang mengganti teks dengan variabel dalam kasus ini adalah:
- Variabel (
$variablename
) yang disertakan dalam single quotes
[ '
] tidak akan "meluas" tetapi variabel di dalam double quotes
[ "
] akan. Jadi, Anda harus mengubah semua single quotes
untuk double quotes
jika mereka mengandung teks yang ingin Anda ganti dengan variabel.
- The
sed
berkisar juga mengandung $
dan segera diikuti oleh surat seperti: $p
, $d
, $w
. Mereka juga akan terlihat seperti variabel yang akan diperluas, sehingga Anda harus melarikan diri mereka $
karakter dengan garis miring terbalik [ \
] seperti: \$p
, \$d
, \$w
.
grep 'TERMINATE' file