小编典典

如何获取与正则表达式匹配的第一行之后的文件部分

all

我有一个大约 1000 行的文件。我想要与我的 grep 语句匹配的行之后的文件部分。

那是:

cat file | grep 'TERMINATE'     # It is found on line 534

所以,我想要从第 535 行到第 1000 行的文件进行进一步处理。

我怎样才能做到这一点?


阅读 111

收藏
2022-07-16

共1个答案

小编典典

以下将打印匹配TERMINATE到文件末尾的行:

sed -n -e '/TERMINATE/,$p'

解释: 禁用在其上执行其脚本后打印每一行的-n默认行为,指示脚本到,是地址(行)范围选择,表示与正则表达式(如
grep)匹配的第一行到文件末尾() ,是打印当前行的打印命令。sed``-e``sed``/TERMINATE/,$``TERMINATE``$``p

这将从匹配行之后的行打印TERMINATE到文件末尾:(从匹配行之后到 EOF,不包括匹配行)

sed -e '1,/TERMINATE/d'

解释:
1,/TERMINATE/是地址(行)范围选择,意思是输入的第一行到匹配TERMINATE正则表达式的第一行,d是删除当前行并跳到下一行的删除命令。由于sed默认行为是打印行,它将在TERMINATE
输入结束后打印行。

如果你想要之前的行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变量(请注意,我们现在在脚本周围使用双引号而不是单引号)。

我忘了告诉脚本中文件名之后的新行很重要,以便 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"

在这些情况下,用变量替换文本的要点是:

  1. [ ] 中的变量 ( $variablename)不会“扩展”,但[ ] 中的变量会。因此,如果它们包含要替换为变量的文本,则必须将它们全部更改为。single quotes``'``double quotes``"``single quotes``double quotes
  2. sed范围还包含 a$和紧随其后的字母,例如:$p, $d, $w。它们也看起来像要扩展的变量,因此您必须$使用反斜杠 [ \] 转义这些字符,例如:\$p, \$d, \$w
2022-07-16