当前位置: 首页 > 知识库问答 >
问题:

AWK不使用正则表达式[0-Z]范围捕获Z

公孙慎之
2023-03-14

在awk中使用gensub时,我注意到我的大写字母Z没有使用以下awk行重新命名:

awk '{name=gensub(/[0-z]/,"succes","g",$0); print name}' range2.txt

在具有以下文本的文件"range2.txt"上:

A
B
Z

在Z上,它只返回Z,而不是“成功”。如果不匹配,它将返回目标。但为什么它是无与伦比的呢?当我把我的问题和其他问题混在一起时,这让我陷入了循环。我有一个解决方案来完成这项工作,但我仍然好奇为什么。我尝试了阿尔法特的所有其他字母和数字,除了首都Z以外,所有这些都成功了。然而,这封信或多或少都在范围之内。

区域性映射返回ISO-88 5915,Z在0~Z范围的中间。

我已经把这个问题归结为我刚才写的,但是没有看到更多的开口。我也使用了其他AWK字符串函数,没有一个找到Z。即分裂匹配GSUB。

我尝试过手动添加Z,然后它就工作了:

awk'{name=gensub(/[0-zZ]/,“succes”,“g”,0美元);print name}范围2。txt

但还是。。。

共有2个答案

赵渊
2023-03-14

毕竟我现在可以自己回答这个问题了。

LC_all=C实际上是工作的,但它必须作为环境变量导出。所以exportLC_ALL=C(或者更具体地说LC_COLLATE)是我应该在控制台发布的,而不仅仅是LC_ALL=C。后者可以使用,但不仅仅是命令必须独立于区域设置。

从版本4开始,Awk应该是独立于语言环境的,但我的版本仍然是版本3。所以对我来说,我仍然需要发布awk,比如:

LC_ALL=C awk '{name=gensub(/[0-z]/,"succes","g",$0); print name}' range2.txt

或者

LC_COLLATE=C awk '{name=gensub(/[0-z]/,"succes","g",$0); print name}' range2.txt

我的grep使用不同的语言环境。我找不到这些区域设置在哪里,这会很有趣,但我确实看到了角色范围的不同行为。此外,grep还可以从使其独立于区域设置中获益。那么在我的设置中:

echo Z | grep [0-z]

不返回任何内容,下面不返回Z

LC_ALL echo Z | grep [0-z]
葛威
2023-03-14

唯一可能的答案是Z不在区域设置的指定范围内。您的发行版上的区域设置可能已被破坏。尝试使用相同范围的其他工具,如grep和sed,看看是否可以重现问题——如果可以,问题在于您的语言环境,如果不是,则在于您的awk。

 类似资料:
  • 假设我有这个虚拟URL,我需要提取植物及其颜色作为 下面的I have正在按预期捕获我需要的元素,但是当我的URL中的植物少于4株时,它无法捕获任何东西。底部有一个指向regex测试员的链接,其中有示例代码和URL,您可以使用。 如何修改这个正则表达式,使其动态工作,从而在不需要静态URL结构的情况下捕获可用内容。现在,假设我最多只能捕获4株植物(8组) https://regex101.com/

  • 问题内容: 我有一个正则表达式: 这应该与该字符串匹配并返回三个捕获(根据Rubular) 这是我的代码: 当有三个时,此打印输出1(组),所以我只能这样做,只会返回32。 问题答案: 调用查找匹配的 下一个 实例,如果没有更多实例,则返回false。尝试调用它三次,看看是否有所有预期的组。 为了澄清,正在尝试 在正则表达式中 找到第一个组 表达式 。您的正则表达式中只有一个这样的组表达式,因此永

  • 问题内容: 我正在使用正则表达式来验证字符串中的特定格式。该字符串将成为游戏规则。 示例:根据规则,“ DX 3”也可以,但是“ DX 14”也可以。。。我知道如何查看字符串并找到一个或多个“数字”,因此问题在于正则表达式将也匹配34,这个数字超出了规则的“范围” … 我是否缺少有关正则表达式的功能?还是根本不可能? 问题答案: 不幸的是,没有简单的方法可以在正则表达式中定义范围。如果要使用范围1

  • 问题内容: 我正在尝试使用Java expr在:之后捕获正确的部分,但是在以下代码中,打印的捕获组是整个字符串,怎么了? 问题答案: 子组的编号从1开始,全文为0。只需循环执行count + 1。

  • 在Python中,如何在非捕获组中捕获组?换句话说,如何重复包含捕获组的非捕获子模式? 例如,捕获导入字符串上的所有包名。例如,字符串: 导入熊猫、操作系统、系统 将返回“pandas”、“os”和“sys”。下面的模式捕获第一个包并到达第二个包: 从这里,我想重复捕获组并匹配以下字符的子模式,即。当我用一个非捕获组包围这个子模式并重复它时: 它不再捕捉里面的群体。

  • 问题内容: 我有以下一行, 我需要拿这个词ABC, 我写了以下代码片段, 所以,如果我说得到,ABC:但是如果我说是ABC,那么我想知道 这是什么和意味着什么呢?如果有人可以用很好的例子向我解释,那会更好。 正则表达式模式中包含一个:,为什么结果忽略了它?组1是否检测到括号内的所有单词? 因此,如果我再加上两个括号,例如:,那么会有两个小组吗?group(1)将退还零件并退还零件? 给出该代码段的