【问题标题】:Why does "grep '[^ -~]'" behave identically to "grep -P -L '[^[:ascii:]]'"?为什么“grep '[^ -~]'”的行为与“grep -P -L '[^[:ascii:]]'”的行为相同?
【发布时间】:2019-01-23 19:01:53
【问题描述】:

我被分配抓取只包含 ASCII 文本的文件。我在网上找到了这段代码,但就是不明白。

grep '[^ -~]'  $someargument

我发现这与以下功能相同:

grep -P -L -r '[^[:ascii:]]' $someargument

【问题讨论】:

  • 您能否解释一下您对 仅包含 ascii 文本的抓取文件 的含义。你的意思是要查找所有只包含ascii文本的文件的所有文件名?
  • grep -P -L -r '[^[:ascii:]]' $someargument 需要工作。但是你的问题是什么?
  • 您之前的问题已关闭是有原因的!不要问与前一个相同的新的!副本:Could anyone explain what this line of code means.
  • Charles Duffy 在您之前的问题中向您解释了为什么它不属于这里。尽管如此,在查看了您的其他问题后,我建议您阅读这些帖子:What topics can I ask about here?How to create a Minimal, Complete, and Verifiable example; What should I do when someone answers my question?
  • 这两个命令在许多情况下具有截然不同的行为。如果$someargument 引用单个文件,则-r 是多余的;并且 -P 选项对于此特定用例无关紧要(您使用的正则表达式不需要 -P 并且指定它不会改变 grep 的行为)。我认为剩下的就是“为什么grep oneregex 的行为与grep -L oppositeregex 的行为相同,其中两个正则表达式是适当互补的,这里并非严格如此。

标签: bash shell


【解决方案1】:

注意:

答案假设您仅使用 POSIX [[:ascii]] 与 [a-zA-Z] 范围匹配的语言环境。

在正则表达式中,您可以指定一个类似 [a-z] 的范围来匹配任何小写字母。在后台,正则表达式引擎实际上会检查 97 到 122 之间的任何代码点(字节值)。

同样,正则表达式 [^ -~] 匹配 ascii 图表中不在 32(空格)和 126 的波浪号(~)之间的任何代码点。所以这通常用于检查特定字符串是否仅包含人类可读的文本(在键盘中:-))。也就是说,它用于清理字符串值。

如果您在字符串中有任何控制字符,例如 control-A、\x01,则正则表达式将匹配,您可以使用 regex_replace() 函数删除它们。

请参考下面的这个 ascii 图表。

考虑这个例子:

$ cat -vT tommy.dat
abc^Adef  # control-A
ghi^Iprq # tab-character
hello
hai

$ grep "[^ -~]" tommy.dat
abcdef
ghi     prq

$

注意:正则表达式 [^ -~] 将匹配换行符、制表符、控制提要,这些内容通常在多行字符串中允许,但您可能希望在匹配中排除它们

在这种情况下,您可以指定 [^\n\t\r -~]

【讨论】:

  • ASCII 图表具有误导性,因为并非所有语言环境都遵循该顺序!因此,使用它来制定grep 的范围是获取适用于某些系统但不适用于其他系统的代码的好方法。 (这就是为什么[A-Z]总是与[[:upper:]] 相同,f/e;参见stackoverflow.com/questions/4834353/…
  • @charles.. 是的,使用不同的语言环境,POSIX 语法和范围 [A-Z] 是不同的.. 对于这种情况,OP 似乎只处理 ASCII 文件进行一些清理,所以我粘贴在这里..
  • 他们很可能正在处理 ASCII 文件,但如果他们在具有非 ASCII 语言环境的系统上执行此操作(或者他们编写的脚本稍后由其他用户在此类系统上运行) ),他们乐于接受惊喜。
  • @Charles.. 是的,对.. 我会把它添加到答案中.. 限制为 US-ASCII 和 ISO-8859-1 字符集..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
相关资源
最近更新 更多