【问题标题】:Bash grep different outputsBash grep 不同的输出
【发布时间】:2018-07-24 13:36:33
【问题描述】:

我对 grep 有一个有趣的问题。基本上,我试图匹配文件中的某些控制字符并获取计数。

grep -ocbUaE $"\x07\|\x08\|\x0B\|\x0C\|\x1A\|\x1B" <file>

很有趣,在 CLI 中它匹配所有控制字符并返回正确的计数,但如果我在 bash 脚本中使用它,它不会匹配任何东西。

任何想法我做错了什么?

测试于:MacOS 和 CentOS - 相同的问题。

感谢您的帮助!

【问题讨论】:

  • 我对@9​​87654323@(因为您没有变量)和您传递给 grep 的一长串开关感到困惑。当然你只需要-cE?您是否有可能在 Bash 中以交互方式运行并仅使用 sh 运行脚本?
  • 嗨,汤姆,感谢您的回答。是的,您对 -cE 就足够了这一事实是正确的。前面的 $ 用于控制字符,是的,我正在使用 sh 在 Bash 中交互地运行脚本。但我不明白为什么我会得到 2 个不同的结果...
  • 另请参阅 stackoverflow.com/questions/5725296/… .. 和 -U 根据手册页仅在 MS-DOS and MS-Windows 上有用

标签: bash grep control-characters


【解决方案1】:

我认为您应该将命令更改为:

grep -cUaE $'[\x07\x08\x0B\x0C\x1A\x1B]' file

我删除了额外的输出标志,当-c 存在时这些标志会被忽略。我假设您包含 -U-a 是有原因的。

其他更改是使用带有单引号的$''(您不希望在此处使用双引号字符串),并将您的一系列ORs 替换为括号表达式,如果其中任何一个匹配字符匹配。

请注意,C 风格的字符串 $'' 并非在所有 shell 中都有效,因此如果您想使用 bash,您应该像 bash script.sh 一样调用您的脚本和/或包含 shebang #!/bin/bash(如果它是可执行的)。 sh script.sh 的行为方式与 bash script.sh 相同。

【讨论】:

  • 感谢您的详细解释以及命令:)。我确认它按预期工作,并且我从 CLI 和脚本中得到了相同的结果。
  • @Ionut 不客气。如果您还没有阅读someone-answers,我建议您阅读!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
相关资源
最近更新 更多