Que*_*ner 6 command-line regex libreoffice language text-processing
我有一个看起来像这样的文本文件:
English words only
English and ???
?????
English words only
English and ???
?????
English words only
Also English words only
English and ???
?????
English words only
English and ???
?????
Run Code Online (Sandbox Code Playgroud)
请注意,在那里的中间有两行,English words only并且Also English words only,一前一后。
我需要做的是将这两行合并为由 a 分隔的一行/,如下所示:
English words only
English and ???
?????
English words only
English and ???
?????
English words only / Also English words only
English and ???
?????
English words only
English and ???
?????
Run Code Online (Sandbox Code Playgroud)
我发现我可以使用以下正则表达式搜索包含 ASCII 字符的行,[[:ascii:]],以及使用[^[:ascii:]]. 但是,我在使用正则表达式查找不匹配条件的实例时遇到了一些麻烦,因为我需要搜索的是没有非 ASCII 字符的行。
我发现了这个关于“反向匹配”的问题,但是,答案超出了我的范围。
然后,当然,根据它们之间的关系来匹配线条是另一个问题。当这些行一前一后时,我可以匹配它们吗?我什至不确定这是可能的。
有没有一种方法可以搜索所有没有非 ASCII 字符的行,然后使用 LibreOffice、Gedit 或命令行组合它们?
请注意该文件是千线长,而且我不知道,但它可能是可能的,有可能是只有英文线路出现是在3或4组。
看起来你可以用来sed完成这项工作,即使它不知道[[:ascii:]]字符类。相反,我们可以使用一系列转义序列 [\\d0-\\d127]指定所有 ASCII 字符,只要我们使用C或POSIX区域设置即可。
这是一个应该可靠的命令:
\n\nLC_ALL=C sed -r \':a;N;s|^([\\d0-\\d127]+)\\n([\\d0-\\d127]+)$|\\1 / \\2|;ta\' file\nRun Code Online (Sandbox Code Playgroud)\n\nLC_ALL=C仅对此命令使用C区域设置(否则会出现错误)-r使用扩展的正则表达式使命令更具可读性(我们需要更少的反斜杠)(GNUsed也识别-E相同的含义)。:a标签 - 循环从这里开始;分隔命令,就像在 shell 中一样N将下一行读入模式空间,这样我们就可以替换\\ns|old|new|old用。。。来代替new^([\\d0-\\d127])\\n([\\d0-\\d127]+)$- 仅使用 ASCII 匹配两行并捕获 中的第一行\\1和 中的第二行\\2。^是行首,\\n是换行符,$是行尾,因此^line 1\\nline 2$测试整个line 1和line 2。\\1 / \\2第一行和第二行用\xc2\xa0/\xc2\xa0换行符分隔。ta- 如果最后一个搜索和替换命令成功,则再次执行循环。这使我们能够处理文件的所有行,处理同时存在两个以上全 ASCII 行的任何实例。非常感谢Eliah Kagan向我展示了如何使用转义序列来匹配 ASCII 字符。
\n