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

时间:2010-09-18 15:43:47

标签: linux bash shell sed

我有以下字符串

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

并想获取ID列表?如何使用sed或其他方法完成此操作?

6 个答案:

答案 0 :(得分:34)

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

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

说明:

  1. cat so.txt会将文件内容打印到stdout
  2. awk '{ print $7 }'将打印第七列,即包含id=n
  3. 的列
  4. cut -f2 -d"="将使用=作为分隔符来削减步骤#2的输出并获取第二列(-f2
  5. 如果您还想获得id=,那么:

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

答案 1 :(得分:3)

使用正则表达式捕获id号并用数字替换整行。像这样的东西应该这样做(匹配一切到“id =”,然后匹配任意数量的数字,然后匹配行的其余部分):

sed -e 's/.*id=\([0-9]\+\).*/\1/g'

为每一行执行此操作,您将获得ID列表。

答案 2 :(得分:2)

perl-solution:

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

答案 3 :(得分:2)

$ ruby -ne 'puts $_.scan(/id=(\d+)/)' file
9
10

答案 4 :(得分:1)

您可以awk在不使用cut的情况下完成所有操作:

awk '{print substr($7,index($7,"=")+1)}' inputfile

您可以使用split()代替substr(index())

答案 5 :(得分:0)

假设输入

{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 

或者如果它总是第7个字段

#! /bin/sh
while read f1 f2 f3 f4 f5 f6 f7 rest
do
echo ${f7##id=}
done <so.txt

另见

Shell Parameter Expansion