3 回答

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

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

TA貢獻1796條經驗 獲得超7個贊
在這里使用的工具是awk:
cat file | awk 'BEGIN{ found=0} /TERMINATE/{found=1} {if (found) print }'
這是如何運作的:
我們將變量“找到”設置為零,評估為假
如果找到與正則表達式匹配的“ TERMINATE”,則將其設置為1。
如果我們的“找到”變量的值為True,請打印:)
如果您在非常大的文件上使用其他解決方案,則可能會占用大量內存。
- 3 回答
- 0 關注
- 956 瀏覽
添加回答
舉報