2017-07-19 165 views
0

我正在自动执行硬件任务,并且我正在使用的其中一个工具输出要连接的串行设备列表。格式如下:基于关键字w/Bash提取字符串中的元素

推介装置的(a)是:/ dev /东西

推介装置(B)是:/ dev /西瓜

推介装置(c)中是:/ dev /东西

我需要找到“西瓜”出现的行,然后提取括号内的字母。所以在这种情况下,它会是“b”。但是,这个顺序不保证保存(这就是为什么我必须用“西瓜”搜索)。

回答

0

你可以很容易地用sed反向引用,例如,

$ sed -n '/watermelon/s/^[^(]*(\([^)]*\).*$/\1/p' file 
b 

  • sed -n压制线的正常打印,
  • /watermalon/匹配西瓜行,
  • s/find/replace/ - 正常的替代选项
    • 找到^[^(]*(\([^)]*\).*$是什么parens并保存为第一参考
    • 什么被保存为第一指涉
  • p打印结果替换\1

如果必须使用bash,那么你就可以[[ ]]做到这一点,与子去除,例如在=~运营商和参数扩展

while read -r line; do 
    [[ $line =~ watermelon ]] && { tmp="${line#*\(}"; echo "${tmp%)*}"; } 
done < file 

输出

b