如何在ksh / bash中从字符串中选择令牌?

时间:2018-10-05 13:30:24

标签: shell parsing

我想这一定是被问过几次了,但是我根本找不到合适的比赛。我想有时候您只是无法想到正确的搜索。

所以,这是我的问题-我想在脚本中分析如下的SQL字符串:

select * from my_table where col1 = #ABC# and col2 like "%#DEF#%";

我想以某种方式通过解析定界ABC来提取令牌DEF#。尝试使用sed,我得到类似的东西:

# echo "something#ABC#else" | sed 's/.*\(#..*#\).*/\1/g'
#ABC#

但是,如果有更多的话,它只会捕获一个:

# echo "something#ABC#else something#DEF#else" | sed 's/.*\(#..*#\).*/\1/g'
#DEF#

似乎我在这里犯错了-有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

$ echo "something#ABC#else something#DEF#else" | grep -oP '(?<=#)[A-Z0-9a-z]+(?=#)'
ABC
DEF

使用grep lookbehind

答案 1 :(得分:1)

假设:

  • 分隔符(onclick(node) { alert(node.key) }, )的数量为偶数,例如'#ABC#def#GHI#'有效,但'#ABC#def#'无效
  • 输出中不应包含定界符
  • 每个解析的令牌都放在单独的行/换行上
  • 我们对位于一对定界符之间的 ALL 个字符(不仅仅是字母/数字)感兴趣

使用偶数分隔符,我们可以让#显示偶数字段,例如:

awk
  • $ echo "something#ABC#else something#DEF#else" | awk -F"#" '{ for (i=2; i<=NF; i+=2) { print $i } }' ABC DEF -将-F"#"指定为#输入字段定界符
  • awk's-使用for (i=2; i<=NF; i+=2)作为索引遍历偶数字段
  • i-打印print $i字段

或者,如果您想消除该子外壳(由ith调用),则可以使用here字符串:

echo ... |