如何在 Bash 中将从字符串开始的所有行移动到文本文件的顶部

如何在 Bash 中将从字符串开始的所有行移动到文本文件的顶部

我有一个包含文本数据的文本文件。我想将从 XY: 和 OTP XY: 开始的所有行移至文件顶部。如何在 Bash 中使用 sed、awk 或其他命令来执行此操作?

答案1

使用 GNU ed(注意:这会file就地修改;要将编辑后的文件输出到标准输出,请改为更改wq,p q):

printf '%s\n' 'g/^\(\|OTP \)XY:/m0' wq | ed -s file

答案2

使用grep

{ grep -E '^(OTP )?XY:' input_file; grep -E -v '^(OTP )?XY:' input_file; } > ouput_file

这 2 个grep命令input_file使用不带 ( -v) 的所需模式来过滤。

{ ... } > output_file两个 grep输出存储到文件中。

答案3

另一种方法可能是使用awk,例如:

awk -v re='^OTP XY:|^XY:'  'NR==FNR && $0 ~ re; NR!=FNR && $0 !~ re' file file

上面使用单个进程,从不在内存中存储超过一行,但对文件进行两次传递(它读取两次)。

如果两种模式之一在文件中不太可能出现,即小到足以适合 ram,您可以使用如下所示的内容:

awk  '/^OTP XY:|^XY:/{print;next} {a = $0 ORS a};END{printf "%s", a}' file

这也使用单个进程,这次对文件进行单次传递,但根据文件的大小/内容,内存使用量可能会增加相当多。

相关内容