3 回答

TA貢獻(xiàn)1942條經(jīng)驗(yàn) 獲得超3個(gè)贊
下面將打印匹配的行,TERMINATE直到文件末尾:
sed -n -e '/TERMINATE/,$p'
說(shuō)明: 在執(zhí)行腳本后-n禁用默認(rèn)行為,即sed在每行上執(zhí)行腳本后將其打印出來(lái),-e指示腳本為sed,/TERMINATE/,$是地址(行)范圍的選擇,這意味著第一行與TERMINATE正則表達(dá)式(如grep)匹配的文件($) ,p是用于打印當(dāng)前行的打印命令。
這將從 匹配行之后的行開(kāi)始打印,TERMINATE直到文件末尾:(
從匹配行之后到EOF,不包括匹配行)
sed -e '1,/TERMINATE/d'
說(shuō)明: 1,/TERMINATE/是地址(行)范圍的選擇,表示與TERMINATE正則表達(dá)式匹配的第一行輸入的第一行,并且d是刪除當(dāng)前行并跳至下一行的delete命令。由于sed默認(rèn)行為是打印行,因此它將在TERMINATE 輸入結(jié)束之后打印行。
編輯:
如果您想在之前的行TERMINATE:
sed -e '/TERMINATE/,$d'
并且如果您希望TERMINATE一次通過(guò)兩個(gè)不同文件中的前后兩行:
sed -e '1,/TERMINATE/w before
/TERMINATE/,$w after' file
之前和之后文件將包含帶有terminate的行,因此要處理每個(gè)文件,您需要使用:
head -n -1 before
tail -n +2 after
編輯2:
如果您不想對(duì)sed腳本中的文件名進(jìn)行硬編碼,則可以:
before=before.txt
after=after.txt
sed -e "1,/TERMINATE/w $before
/TERMINATE/,\$w $after" file
但是然后您必須轉(zhuǎn)義$最后一行的含義,以便外殼程序不會(huì)嘗試擴(kuò)展$w變量(請(qǐng)注意,我們現(xiàn)在在腳本周?chē)褂秒p引號(hào)而不是單引號(hào))。
我忘了告訴新行在腳本中的文件名之后很重要,以便sed知道文件名結(jié)束。
編輯: 2016-0530
SébastienClément問(wèn):“如何TERMINATE用變量替換硬編碼?”
您將為匹配的文本創(chuàng)建一個(gè)變量,然后以與前面的示例相同的方式進(jìn)行操作:
matchtext=TERMINATE
before=before.txt
after=after.txt
sed -e "1,/$matchtext/w $before
/$matchtext/,\$w $after" file
在前面的示例中將變量用于匹配文本:
## 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"
在這些情況下,用變量替換文本的要點(diǎn)是:
[ ]中$variablename包含的變量()不會(huì)“擴(kuò)展”,但[ ]中的變量會(huì)“擴(kuò)展” 。因此,如果所有包含要用變量替換的文本,則必須將所有更改為。 single quotes'double quotes"single quotesdouble quotes
該sed范圍也包含$并緊跟像字母:$p,$d,$w。他們也將像變量加以擴(kuò)展,所以你要逃避這些$字符用反斜杠[ \],如:\$p,\$d,\$w。

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超2個(gè)贊
作為一個(gè)簡(jiǎn)單的近似值,您可以使用
grep -A100000 TERMINATE file
它會(huì)抓緊TERMINATE并在該行之后輸出最多100000行。
從手冊(cè)頁(yè)
-A NUM, --after-context=NUM
匹配行后打印NUM行尾隨上下文。 在連續(xù)的匹配組之間放置包含組分隔符(-)的行。使用-o或--only-matching選項(xiàng),此選項(xiàng)無(wú)效,并給出警告。

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超7個(gè)贊
在這里使用的工具是awk:
cat file | awk 'BEGIN{ found=0} /TERMINATE/{found=1} {if (found) print }'
這是如何運(yùn)作的:
我們將變量“找到”設(shè)置為零,評(píng)估為假
如果找到與正則表達(dá)式匹配的“ TERMINATE”,則將其設(shè)置為1。
如果我們的“找到”變量的值為T(mén)rue,請(qǐng)打印:)
如果您在非常大的文件上使用其他解決方案,則可能會(huì)占用大量?jī)?nèi)存。
添加回答
舉報(bào)