Berikut ini akan mencetak baris yang cocok TERMINATEsampai akhir file:
sed -n -e '/TERMINATE/,$p'
Dijelaskan: -n menonaktifkan perilaku default sedpencetakan setiap baris setelah mengeksekusi skripnya di atasnya, -emenunjukkan skrip untuk sed, /TERMINATE/,$adalah pilihan kisaran alamat (baris) yang berarti baris pertama yang cocok dengan TERMINATEekspresi reguler (seperti grep) ke akhir file ( $) , dan pmerupakan perintah cetak yang mencetak baris saat ini.
Ini akan mencetak dari baris yang mengikuti baris yang cocok TERMINATEsampai 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 TERMINATEekspresi reguler, dan dmerupakan perintah hapus yang menghapus baris saat ini dan melompat ke baris berikutnya. Karena sedperilaku 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 TERMINATEdalam 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 $wvariabel (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 TERMINATEdengan 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 quotesuntuk double quotesjika mereka mengandung teks yang ingin Anda ganti dengan variabel.
- The
sedberkisar 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