【问题标题】:GREP: Extracting all characters from inside double quoteGREP:从双引号内提取所有字符
【发布时间】:2013-11-05 19:29:48
【问题描述】:

我做了什么:

grep -E -o -e "[^"]+"

它可以提取,例如:“Poland”和“New York”,但由于“á”的存在而无法提取“Marcos Juárez”......它将输出削减为“Marcos Ju”和“rez” "

如何防止这种情况发生?

【问题讨论】:

  • 我无法重现您的问题,使用您的正则表达式,给出了预期的输出。可能是您终端中的语言环境问题吗?
  • 如果我使用 grep -c 它会给我三个匹配项,这是正确的。但是,我将输出放在一个文件中,'| wc -l' 在这种情况下变成 4 而不是 3。

标签: regex shell unix grep


【解决方案1】:

我不认为这是一个正则表达式问题。这可能是 Unicode 或宽字符问题。
你的正则表达式应该是"[^"]+" 那不是双引号。

我不知道 unix 命令行,但是 "[^']+" 参数的分隔符是什么, 它是由空格完成的吗?

试试".*?",它应该匹配。如果不是 unicode 问题。

【讨论】:

  • 我已经在使用“[^”]+”(编辑了我的问题)。您的正则表达式返回了所有内容。
  • @Atieh - 如果".*?" 返回所有内容,则正则表达式是.*? 而不是".*?",这意味着命令行处理器正在剥离双引号。我不知道 Unix,但我知道正则表达式。
  • ".*?"语法是正确的,但它会返回所有内容。我想我会纠正一个脚本,删除每个单词的第一个和最后一个字符(“...”),这样就可以解决它。无论如何,谢谢。
【解决方案2】:

试试:

grep -Po  '(?<=\")(.*?)(?=\")'

对我来说,这三个都正确输出。

【讨论】:

  • 错误:指定的匹配器冲突
  • 请张贴输入文件。我在您的示例上运行了它,它在两台 Linux 机器上运行良好。
  • 对于没有“”的城市,我做了: awk -F , '{print $4}' cities.txt | grep -E -o "[^"]+" 如果我​​将 -c 添加到 grep,它返回的匹配等于文本文件中的行数,但是如果我将它通过管道传递给 'wc -l',它会给我更少的行数.
  • @Atieh 与上面的示例不同,city.txt 有许多元素(在每一行),它们被引号包围。我怀疑编写一个小型解析器比使用正则表达式 grep 容易得多。
  • 我只需要城市名称。我使用 awk 获得了它们,我想要的是没有“”的名称,而我的问题是像 'á' 这样的字符
猜你喜欢
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
  • 2018-09-18
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
相关资源
最近更新 更多