首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在只包含ASCII字符的文件中搜索行,然后对其进行操作?

如何在只包含ASCII字符的文件中搜索行,然后对其进行操作?
EN

Ask Ubuntu用户
提问于 2018-04-26 14:41:15
回答 2查看 2.7K关注 0票数 7

我有一个像这样的文本文件:

代码语言:javascript
复制
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 onlyAlso English words only,一条接一条。

我需要做的是将这两行合并成由/分隔的一行,如下所示:

代码语言:javascript
复制
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组中的英文行。

EN

回答 2

Ask Ubuntu用户

回答已采纳

发布于 2018-04-26 16:29:19

似乎您可以使用sed来完成这项工作,尽管它不知道[[:ascii:]]字符类。我们可以使用逸出序列 [\d0-\d127]来指定所有ASCII字符,只要我们使用CPOSIX区域设置即可。

这里有一个应该是可靠的命令:

代码语言:javascript
复制
LC_ALL=C sed -r ':a;N;s|^([\d0-\d127]+)\n([\d0-\d127]+)$|\1 / \2|;ta' file

Notes

  • LC_ALL=C只对此命令使用C语言环境设置(否则会出现错误)
  • -r使用扩展正则表达式来提高命令的可读性(我们需要更少的反斜杠) (GNU sed也识别具有相同含义的-E )。
  • :a标签循环从这里开始
  • ;分离命令,如在shell中
  • N将下一行读入模式空间,因此我们可以替换\n
  • s|old|new|old替换为new
  • ^([\d0-\d127])\n([\d0-\d127]+)$ -只匹配两行ASCII,并捕获\1中的第一行和\2中的第二行。^是行的开始,\n是换行符,$是行的末尾,所以^line 1\nline 2$测试了line 1line 2的整个过程。
  • \1 / \2第一行和第二行,用/分隔,而不是换行符。
  • ta -如果最后一次搜索和替换命令成功,则再次执行循环.这使我们能够处理文件的所有行,处理有两个以上ASCII行在一起的任何实例。

Many感谢 未定义 用于 未定义.

票数 4
EN

Ask Ubuntu用户

发布于 2018-04-26 14:48:57

如果您希望整行只包含ASCII字符,则需要将模式锚定在行的开头和结尾,例如使用grep

代码语言:javascript
复制
$ 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的D2D3

J14A5J26

允许您使用:

A7

多行匹配增加了整个另一层的复杂性,因为许多常见的命令行文本处理实用程序都是基于行的。您可以强制D8使用D9标志来关闭整个文件,但是有一些工具,比如D10D11本身,在这一点上可能更合适。

您需要解决的下一个问题是如何在多行匹配的上下文中解释“行的开始”和“行的结束”这两个概念。一些工具为此提供了标志,如C12中所描述的:D13就是其中之一,它提供了一个D14修饰符。您仍然需要通过取消默认记录分隔符(在这里使用D15完成)来关闭文件;例如

A16

票数 4
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/1028440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档