【问题标题】:Reorganizing outputs using grep使用 grep 重新组织输出
【发布时间】:2013-11-08 02:24:20
【问题描述】:

我有一些随机输入的数字,例如:

0x3000 0x80004000        # There are Many Random Strings Here#                        0x7000
0x8600 x1260       x1800 x45003045 # Random Strings #   

所以x后面会有一个4位或8位的数字。 我只需要获取 4 位数或 8 位数

我希望输出是这样的,每行一个:

0x3000
0x80004000
0x7000
0x8600
x1260
x1800
x45003045

【问题讨论】:

  • 欢迎来到 Stack Overflow。请尽快阅读About 页面。您尝试显示预期输出很好,但不幸的是,预期输出中的 0x7000 数字没有出现在输入中。这不是一个好兆头。您还说您只想要 4 位或 8 位数字,但随后也显示 0xx。此外,您有一个十六进制前缀,但没有显示数字 A-F(或 a-f);他们也期待吗?下一个问题总是“你试过什么?”我们将帮助人们完善他们的答案,但一般来说,诚实地尝试解决问题是个好主意。
  • 感谢您的回复,我想获取设备和供应商 ID forge.voodooprojects.org/p/chameleon/source/tree/2262//trunk/…

标签: bash unix terminal grep


【解决方案1】:

grep 方法:

grep -oP '0?x([0-9]{4}){1,2}' test.txt

如果需要,

  1. [0-9]可以改为[0-9a-f]
  2. 可以添加-i 选项以不区分大小写。

例如

 $ cat test.txt
 0x3000 0x80004000        # There are Many Random Strings Here#                            0x7000
 0x8600 x1260       x1800 x45003045 # Random Strings #   
 0x123456

 $ grep -oP '0?x([0-9]{4}){1,2}' test.txt
 0x3000
 0x80004000
 0x7000
 0x8600
 x1260
 x1800
 x45003045
 0x1234

【讨论】:

  • 但我在 Mac OS X 10.8.5 上遇到此错误 grep -oP '0?x([0-9]{4}){1,2}' /Users/Jackson/Desktop/ gma.txt 显示用法: grep [-abcDEFGHhIiJLlmnOoPqRSsUVvwxZ] [-A num] [-B num] [-C[num]] [-e pattern] [-f file] [--binary-files=value] [-- color=when] [--context[=num]] [--directories=action] [--label] [--line-buffered] [--null] [pattern] [file ...]
  • 好吧,你没有提到Mac OS X。 &我没有 OSX 在本地进行测试。我的第一个猜测是,使用{} 语法存在一些问题。它可能需要使用\{ ... \} 转义。
【解决方案2】:

awk 解决方案

awk '{for (i=1;i<=NF;i++) if ($i~/[0-9]*x[0-9]+/) print $i}' file
0x3000
0x80004000
0x7000
0x8600
x1260
x1800
x45003045

要确保它在x 之后只有 4 或 8 位数字,您可以这样做:

awk --re-interval '{for (i=1;i<=NF;i++) if ($i~/[0-9]*x([0-9]{4}|[0-9]{8})$/) print $i}' file

Gnu awk 需要--re-interval 来启用区间表达式{4}

【讨论】:

    【解决方案3】:

    通过 sed 查找文件以用换行符替换空格,然后查找换行符 (^) 后跟 x 然后是数字或 (|) 换行符 (^) 后跟 0x 数字 如果你不想要十六进制(虽然我怀疑你这样做我怀疑你这样做)然后摆脱 a-fA-F

    cat yourfilehere | sed -e "s/[ \t]/\n/g" | grep -E "^x[0-9a-fA-F].*|^0x[0-9a-fA-F]*"
    

    【讨论】:

    • 欢迎来到 SO。只是一些 cmets: 1. cat | sed 被视为 UUOC。 2. sed 来转换空格 & 制表符 & 然后管道到 grep 也不是必需的。您可能可以使用grep -o -w。 3. 很遗憾,您发布的代码不符合 OP 的要求。 x...之后的 4 或 8 个字符...
    • 我很自豪能获奖!虽然点了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    相关资源
    最近更新 更多