Linux Shell脚本:如何剪切字符串的一部分

Linux Shell脚本:如何剪切字符串的一部分,linux,bash,shell,sed,Linux,Bash,Shell,Sed,我有下面的字符串 â â³ eGalax Inc. USB TouchController id=9 [slave pointer (2)] â â³ eGalax Inc. USB TouchController id=10 [slave pointer (2)] 想得到身份证的名单吗?如何使用sed或其他方法实现这一点 我将示例的内容粘贴到名为so.txt的文件中 $ cat so.txt | awk '{ print $7 }

我有下面的字符串

â   â³ eGalax Inc. USB TouchController          id=9    [slave  pointer  (2)]
â   â³ eGalax Inc. USB TouchController          id=10   [slave  pointer  (2)]

想得到身份证的名单吗?如何使用sed或其他方法实现这一点

我将示例的内容粘贴到名为
so.txt的文件中

$ cat so.txt | awk '{ print $7 }' | cut -f2 -d"="
9
10
说明:

  • cat so.txt
    将文件内容打印到
    stdout
  • awk'{print$7}'
    将打印第七列,即包含
    id=n的列
  • cut-f2-d“=”
    将使用
    =
    作为分隔符来剪切步骤2的输出,并获得第二列(
    -f2
  • 如果您希望同时获得
    id=
    ,那么:

    $ cat so.txt | awk '{ print $7 }' 
    id=9
    id=10
    

    使用正则表达式捕获id号并用该编号替换整行。类似这样的操作应该可以做到(将所有内容匹配到“id=”,然后匹配任意数量的数字,然后匹配行的其余部分):

    对每一行执行此操作,就会得到ID列表。

    perl解决方案:

    perl -nE 'say $1 if /id=(\d+)/' filename
    

    您可以让
    awk
    无需使用
    cut
    即可完成所有操作:

    awk '{print substr($7,index($7,"=")+1)}' inputfile
    
    您可以使用
    split()

    {Anything}id={ID}{space}{Anything} 
    {Anything}id={ID}{space}{Anything}
    
    --

    #/垃圾箱/垃圾箱
    边读边读;做
    rhs=${s##*id=}
    id=${rhs%%*}
    echo$id#在这里使用$id做你想做的事
    
    这个方法给出了9和1,但应该是9和10,对了,我在粘贴sed行时犯了一个错误。更新后可以正常工作。Thaks这正是我想要的!猫和割的无用用法。awk可以做所有这些。@user229426:你的意思是不必要地使用cat和cut,而不是无用的,不是吗?这是将
    awk
    与cut结合使用的一个很好的解释。我试图在另一个用例中得到这个确切的东西,并在awk手册页和awk教程中苦苦挣扎。非常感谢您花时间解释您的代码!
    $ ruby -ne 'puts $_.scan(/id=(\d+)/)' file
    9
    10
    
    {Anything}id={ID}{space}{Anything} 
    {Anything}id={ID}{space}{Anything}
    
    #! /bin/sh
    while read s; do
       rhs=${s##*id=}
       id=${rhs%% *}
       echo $id # Do what you will with $id here
    done <so.txt 
    
    #! /bin/sh
    while read f1 f2 f3 f4 f5 f6 f7 rest
    do
    echo ${f7##id=}
    done <so.txt