下面将打印匹配的行,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
但是随后您必须转义$
最后一行的含义,以使shell不会尝试扩展$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 quotes
double quotes
- 该
sed
范围也包含$
并紧跟像字母:$p
,$d
,$w
。他们也将像变量加以扩展,所以你要逃避这些$
字符用反斜杠[ \
],如:\$p
,\$d
,\$w
。
grep 'TERMINATE' file