我有一个大约 1000 行的文件。我想要与我的 grep 语句匹配的行之后的文件部分。
那是:
cat file | grep 'TERMINATE' # It is found on line 534
所以,我想要从第 535 行到第 1000 行的文件进行进一步处理。
我怎样才能做到这一点?
以下将打印匹配TERMINATE到文件末尾的行:
TERMINATE
sed -n -e '/TERMINATE/,$p'
解释: 禁用在其上执行其脚本后打印每一行的-n默认行为,指示脚本到,是地址(行)范围选择,表示与正则表达式(如 grep)匹配的第一行到文件末尾() ,是打印当前行的打印命令。sed``-e``sed``/TERMINATE/,$``TERMINATE``$``p
-n
sed``-e``sed``/TERMINATE/,$``TERMINATE``$``p
这将从匹配行之后的行打印TERMINATE到文件末尾:(从匹配行之后到 EOF,不包括匹配行)
sed -e '1,/TERMINATE/d'
解释: 1,/TERMINATE/是地址(行)范围选择,意思是输入的第一行到匹配TERMINATE正则表达式的第一行,d是删除当前行并跳到下一行的删除命令。由于sed默认行为是打印行,它将在TERMINATE 输入结束后打印行。
1,/TERMINATE/
d
sed
如果你想要之前的行TERMINATE:
sed -e '/TERMINATE/,$d'
TERMINATE如果您希望在一次传递中在两个不同的文件中前后两行:
sed -e '1,/TERMINATE/w before /TERMINATE/,$w after' file
before 和 after 文件将包含带有 terminate 的行,因此要处理每个您需要使用的行:
head -n -1 before tail -n +2 after
如果您不想在 sed 脚本中硬编码文件名,您可以:
before=before.txt after=after.txt sed -e "1,/TERMINATE/w $before /TERMINATE/,\$w $after" file
但是你必须转义$最后一行的含义,这样 shell 就不会尝试扩展$w变量(请注意,我们现在在脚本周围使用双引号而不是单引号)。
$
$w
我忘了告诉脚本中文件名之后的新行很重要,以便 sed 知道文件名结束。
您将如何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
$p
$d
\
\$p
\$d
\$w