【问题标题】:How to select specific string between a line with sed or awk, without print the whole line如何使用 sed 或 awk 在一行之间选择特定字符串,而不打印整行
【发布时间】:2016-09-05 15:01:28
【问题描述】:

我想用 sed 或 awk 在一个大的 txt 文件的一行中选择一个特定的字符串。但我总是得到整行,每行有 100.000 多个字符。

例如:

</div><div class="follow   withFollow" id="user-id-1234567890"> <a href="/app/users/id-1234567890/test/ </div><div class="follow   withFollow" id="user-id-0123456789"> <a href="/app/users/id-0123456789/test/" 12345678990 1234877890 1234767890 1245456780 123456790 withFollow" id="user-id-9873456789">

我唯一想要的是:

withFollow" id="user-id-1234567890">, withFollow" id="user-id-0123456789">, withFollow" id="user-id-9873456789">

输出:

1234567890
0123456789
9873456789

我尝试了很多:

sed -n '/**user-id-**/,/**">**/p' FILE
awk '/**user-id-**/,/**">**/p' FILE
awk '/**user-id-**/,/**">**/p' FILE | grep -Eo "[0-9]{1,15}" > output.txt

对于最后一个,我在同一行中只得到了其他数字,所以不仅在id="user-id-1234567890"&gt; 内。

【问题讨论】:

    标签: bash shell unix awk sed


    【解决方案1】:

    你可以使用 grep:

    $ grep -oP 'user-id-\K[^"]*' file
    1234567890
    0123456789
    9873456789
    

    或者如果你只想匹配数字:

    grep -oP 'user-id-\K\d*' file
    

    【讨论】:

    • 遇到错误:grep -oP 'user-id-\K[^"]*' 文件用法:grep [-abcDEFGHhIiJLlmnOoqRSsUVvwxZ] [-A num] [-B num] [-C [num]] [-e 模式] [-f 文件] [--binary-files=value] [--color=when] [--context[=num]] [--directories=action] [--label ] [--line-buffered] [--null] [pattern] [file ...]
    • @patrick 所以你的 grep 不支持 -P 选项......你在什么操作系统上,你安装了什么版本的 grep?
    • grep (BSD grep) 2.5.1-FreeBSD - MAC OSX
    • @patrick:那么我认为你不能在一个 grep 命令中完成它。试试这个管道:grep -o 'user-id-[^"]*' file | grep -o '[0-9]*'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多