【发布时间】:2011-04-14 03:01:37
【问题描述】:
我有以下字符串
â â³ eGalax Inc. USB TouchController id=9 [slave pointer (2)]
â â³ eGalax Inc. USB TouchController id=10 [slave pointer (2)]
并想获得 id 的列表?如何使用 sed 或其他东西来做到这一点?
【问题讨论】:
我有以下字符串
â â³ eGalax Inc. USB TouchController id=9 [slave pointer (2)]
â â³ eGalax Inc. USB TouchController id=10 [slave pointer (2)]
并想获得 id 的列表?如何使用 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
【讨论】:
awk 与cut 结合使用的一个很好的解释。我试图将这个确切的东西用于另一个用例,并且在 awk 手册页和 awk 教程方面遇到了很多困难。非常感谢您花时间解释您的代码!
使用正则表达式捕获 id 编号并将整行替换为该编号。应该这样做(匹配所有内容到“id =”,然后匹配任意数量的数字,然后匹配该行的其余部分):
sed -e 's/.*id=\([0-9]\+\).*/\1/g'
对每一行执行此操作,您将获得 id 列表。
【讨论】:
perl 解决方案:
perl -nE 'say $1 if /id=(\d+)/' filename
【讨论】:
您可以让awk 完成所有操作,而无需使用cut:
awk '{print substr($7,index($7,"=")+1)}' inputfile
您可以使用split() 代替substr(index())。
【讨论】:
$ 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
或者如果它总是第 7 个字段
#! /bin/sh
while read f1 f2 f3 f4 f5 f6 f7 rest
do
echo ${f7##id=}
done <so.txt
另见
【讨论】: