亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何獲取與正則表達式匹配的第一行之后的文件部分?

如何獲取與正則表達式匹配的第一行之后的文件部分?

互換的青春 2019-12-09 11:17:55
我有一個約有1000行的文件。我想要文件的與我的grep語句匹配的行之后的部分。那是:$ cat file | grep 'TERMINATE'     # It is found on line 534因此,我希望文件從535行到1000行進行進一步處理。我怎樣才能做到這一點?
查看完整描述

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。


查看完整回答
反對 回復 2019-12-09
?
慕婉清6462132

TA貢獻1804條經驗 獲得超2個贊

作為一個簡單的近似值,您可以使用


grep -A100000 TERMINATE file

它會抓緊TERMINATE并在該行之后輸出最多100000行。


從手冊頁


-A NUM, --after-context=NUM


匹配行后打印NUM行尾隨上下文。 在連續的匹配組之間放置包含組分隔符(-)的行。使用-o或--only-matching選項,此選項無效,并給出警告。


查看完整回答
反對 回復 2019-12-09
?
蕪湖不蕪

TA貢獻1796條經驗 獲得超7個贊

在這里使用的工具是awk:


cat file | awk 'BEGIN{ found=0} /TERMINATE/{found=1}  {if (found) print }'

這是如何運作的:


我們將變量“找到”設置為零,評估為假

如果找到與正則表達式匹配的“ TERMINATE”,則將其設置為1。

如果我們的“找到”變量的值為True,請打印:)

如果您在非常大的文件上使用其他解決方案,則可能會占用大量內存。


查看完整回答
反對 回復 2019-12-09
  • 3 回答
  • 0 關注
  • 956 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號