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

标签 bash shell scripting grep

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

即:

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

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

我该怎么做?

最佳答案

以下将打印匹配 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 是删除命令,删除当前行并跳到下一行。由于 sed 默认行为是打印行,它会打印 TERMINATE 之后的行到输入结束。

如果你想要 TERMINATE 之前的行:

sed -e '/TERMINATE/,$d'

并且如果您希望一次通过两个不同文件中的 TERMINATE 之前和之后的两行:

sed -e '1,/TERMINATE/w before
/TERMINATE/,$w after' file

之前和之后的文件将包含带有终止的行,因此要处理每个文件,您需要使用:

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)[']不会“展开”,但是双引号里的变量 ["] 会。因此,如果它们包含您想要的文本,则必须将所有 单引号 更改为 双引号替换为变量。
  2. sed 范围还包含一个 $ 并紧跟一个字母,例如:$p$d$w。它们看起来也像是要展开的变量,因此您必须使用反斜杠 [\] 来转义那些 $ 字符,例如:\$p , \$d, \$w.

关于bash - 如何在匹配正则表达式的第一行之后获取文件的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7103531/

相关文章:

linux - 简单的 Shell 脚本不会附加到文件

linux - 查找不包含 "*.sql"文件的目录

linux - 删除星号中旧文件夹的脚本

使用 forkpty() 创建了一个 bash shell。这个 shell 启动的程序似乎在忽略 SIGINT 的情况下启动。为什么?

windows - 可以生成小型、独立的 Windows EXE 的脚本语言?

java - 从 Python 与 Jython/Java 通信(子进程)

linux - 我删除目录后登录bash总是提示 "shell-init error retrieving current directory getcwd solve"

java - Gradle 脱离 Bash for 循环

git - 如何在管道传输时配置 git 输出?

linux - `set -x` 有什么作用?