2017-07-19 163 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