我有一个很大的文本文件,输出该文件的应用程序将其自动换行为 50 个字符。
实际的原始展开行长度差异很大,从 1 个字符到 1500 多个字符不等。
我需要一些可以按相反顺序(从底部开始)处理文件并删除位于位置 51 的每个 CRLF,但保留其他位置的所有 CRLF 的东西。
(因此顺序相反。超过 1500 个字符的行在每个位置 51 处都有 56 个 CRLF。最后的必须首先删除,以保持字符串完整性)。
由于逆序的必要性,据我所知,这意味着 sed 已经过时了。notepad++ 中的正则表达式查找和替换也没有“向后方向”作为可选选项。
我在窗户上。文件本身是通过 powershell 生成的,但我通过 Cmder 安装了 python、node、cygwin,老实说,我愿意为此安装任何东西,但由于公司政策,wsl 目前是不可能的。VBScript 也是如此。
我尝试了 n++ 中的各种查找和替换扩展选项,但除了 pos51 处的 [CR][LF] 之外没有一致的轮廓符。
示例——尝试保留格式:
COMMENT ON COLUMN "vendor"."things_andstuf_associa
tions"."id" IS 'The unique identifier for a things
andstuf association record.';
COMMENT ON COLUMN "vendor"."things_andstuf_associa
tions"."course_id" IS 'Identifies the course.';
COMMENT ON COLUMN "vendor"."things_andstuf_associa
tions"."created_at" IS 'Timestamp of when the reco
rd was created.';
COMMENT ON COLUMN 只是数千行日志记录中的一小部分。有些从调试开始,有些从信息开始,有些从 SELECT 开始,有些从格式化日期开始,有些从 UPSERT 开始,有些从 ON CONFLICT 开始......它变化很大。--所有行都不以分号结尾。保留空白行可能会更好。–
没有特定于每行开头的唯一格式化文本字符串。我可能必须(并且愿意)接受所有恰好包含 50 个字符的行将与所有正确合并的行一起错误地合并。
输出来自已编译的 python 应用程序,并通过 powershell 中的 start-transcript 捕获。我无法影响 powershell 生成时的输出。但是,我可以在事后影响 powershell 输出的转录文件。
我能找到的唯一常量是换行在位置 51 处有一个 CRLF。
OP 指出,真正的线条没有共同的起点/终点。修改OP的示例以显示一些变化:
OP 已声明行以 CR/LF (
\r\n
) 结尾,因此我确保我的文件以 CR/LF 结尾:一个
awk
想法:笔记:
-v maxlen=51
可以删除,并且所有其他引用maxlen
将替换为51
\r
),这将错误地将所述行与文件中的下一行合并这会生成:
也许您可以使用模式
(?m)(?<=^.{50})\r?\n
,PowerShell 示例:结果是:
如果这是您期望的输出,那么您可以使用
Get-Content -Raw
将文件内容获取为单个多行字符串,然后应用此替换:有关详细信息,请参阅https://regex101.com/r/sO0miY/1 。
由于逆序的必要性,据我所知,这种方法
sed
已经过时了:不需要以逆序处理你的文件。只需连接所有 51 个字符的行,直到遇到不同长度的行,将其也连接起来,删除\r\n
除最后一行之外的所有行,然后打印。GNU
sed
确实是一个选择:\n
和所有\r\n
,然后打印。如果你
sed
不是 GNU,sed
你可能需要将其分成几部分: