我有一个像这样的文本文件:
English words only
English and 日本語
日本語のみ
English words only
English and 日本語
日本語のみ
English words only
Also English words only
English and 日本語
日本語のみ
English words only
English and 日本語
日本語のみ注意,在中间有两行,English words only和Also English words only,一条接一条。
我需要做的是将这两行合并成由/分隔的一行,如下所示:
English words only
English and 日本語
日本語のみ
English words only
English and 日本語
日本語のみ
English words only / Also English words only
English and 日本語
日本語のみ
English words only
English and 日本語
日本語のみ我发现我可以使用以下正则表达式[[:ascii:]]搜索带有ASCII字符的行,以及使用[^[:ascii:]]搜索非ASCII。但是,我在使用正则表达式查找不匹配条件的实例时遇到了一些困难,因为我需要搜索的是没有非ASCII字符的行。
我找到了关于“逆匹配”的问题,但是,答案超出了我的能力。
当然,根据线与对方的关系来匹配线条也是另一个问题。当这些线是一个接一个的时候,我能匹配它们吗?我甚至不确定那是可能的。
有没有一种方法可以搜索没有非ASCII字符的所有行,然后使用LibreOffice、Gedit或命令行组合它们?
请注意,该文件有数千行长,我也不确定,但可能只出现3或4组中的英文行。
发布于 2018-04-26 16:29:19
似乎您可以使用sed来完成这项工作,尽管它不知道[[:ascii:]]字符类。我们可以使用逸出序列 [\d0-\d127]来指定所有ASCII字符,只要我们使用C或POSIX区域设置即可。
这里有一个应该是可靠的命令:
LC_ALL=C sed -r ':a;N;s|^([\d0-\d127]+)\n([\d0-\d127]+)$|\1 / \2|;ta' fileLC_ALL=C只对此命令使用C语言环境设置(否则会出现错误)-r使用扩展正则表达式来提高命令的可读性(我们需要更少的反斜杠) (GNU sed也识别具有相同含义的-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第一行和第二行,用/分隔,而不是换行符。ta -如果最后一次搜索和替换命令成功,则再次执行循环.这使我们能够处理文件的所有行,处理有两个以上ASCII行在一起的任何实例。发布于 2018-04-26 14:48:57
如果您希望整行只包含ASCII字符,则需要将模式锚定在行的开头和结尾,例如使用grep
$ grep -P '^[[:ascii:]]*有些工具提供了全行标志,如grep的-x或--line-regexp:-x, --line-regexp Select only those matches that exactly match the whole line. For a regular expression pattern, this is like parenthesizing the pattern and then surrounding it with ^ and $. 允许您使用:$ grep -Px '[[:ascii:]]*' file
English words only
English words only
English words only
Also English words only
English words only多行匹配增加了整个另一层的复杂性,因为许多常见的命令行文本处理实用程序都是基于行的。您可以强制grep使用-Z标志来关闭整个文件,但是有一些工具,比如pcregrep或perl本身,在这一点上可能更合适。您需要解决的下一个问题是如何在多行匹配的上下文中解释“行的开始”和“行的结束”这两个概念。一些工具为此提供了标志,如Regex教程:锚中所描述的:perl就是其中之一,它提供了一个/m修饰符。您仍然需要通过取消默认记录分隔符(在这里使用-0777完成)来关闭文件;例如$ perl -0777 -pe 's{^([[:ascii:]]+)\n([[:ascii:]]+)$}{$1 / $2}mg' file
English words only
English and 日本語
日本語のみ
English words only
English and 日本語
日本語のみ
English words only / Also English words only
English and 日本語
日本語のみ
English words only
English and 日本語
日本語のみ file
English words only
English words only
English words only
Also English words only
English words only有些工具提供了全行标志,如grep的D2或D3:
J14A5J26
允许您使用:
A7
多行匹配增加了整个另一层的复杂性,因为许多常见的命令行文本处理实用程序都是基于行的。您可以强制D8使用D9标志来关闭整个文件,但是有一些工具,比如D10或D11本身,在这一点上可能更合适。
您需要解决的下一个问题是如何在多行匹配的上下文中解释“行的开始”和“行的结束”这两个概念。一些工具为此提供了标志,如C12中所描述的:D13就是其中之一,它提供了一个D14修饰符。您仍然需要通过取消默认记录分隔符(在这里使用D15完成)来关闭文件;例如
A16
https://askubuntu.com/questions/1028440
复制相似问题