我有一个大约 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"
在这些情况下用变量替换文本的要点是:
- 用
单引号
括起来的变量($variablename
)['
]不会“展开”,但是双引号里的变量
["
] 会。因此,如果它们包含您想要的文本,则必须将所有单引号
更改为双引号
替换为变量。 sed
范围还包含一个$
并紧跟一个字母,例如:$p
、$d
,$w
。它们看起来也像是要展开的变量,因此您必须使用反斜杠 [\
] 来转义那些$
字符,例如:\$p
,\$d
,\$w
.
关于bash - 如何在匹配正则表达式的第一行之后获取文件的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7103531/