2014-02-21 27 views
0

我想找到放在括号中的字符串。我如何使用sed来拉动字符串?如何使用sed来标识括号中的字符串?

# cat /sys/block/sdb/queue/scheduler 
noop anticipatory deadline [cfq] 

我没有得到确切的结果

# cat /sys/block/sdb/queue/scheduler | sed 's/\[*\]//' 
noop anticipatory deadline [cfq 

我期待的输出

cfq 
+0

是否必须sed的?这种情况下'grep'似乎更好。 – fedorqui

+0

我向所有选项开放。可以grep给我的字符串'cfq'? –

回答

2

它可以与grep容易,如果它恰好是改变位置其中括号内的文字位于:

$ grep -Po '(?<=\[)[^]]*' file 
cfq 

这是后视:每当您找到一个字符串[时,开始提取所有字符到]

见另一个例子:

$ cat a 
noop anticipatory deadline [cfq] 
hello this [is something] we want to [enclose] yeah 

$ grep -Po '(?<=\[)[^]]*' a 
cfq 
is something 
enclose 

您还可以使用awk对于这一点,如果它总是在同样的位置:

$ awk -F[][] '{print $2}' file 
cfq 

它设置字段分隔符为[]。并由此打印第二个。

而且随着sed

$ sed 's/[^[]*\[\([^]]*\).*/\1/g' file 
cfq 

这是一个有点乱,但基本上它是从文本块中[]并打印回之间寻找。

+0

太棒了!为我工作.. :) –

+1

然后接受答案,请。 – Carlo

0

我找到了一个解决方案为可能

cut -d "[" -f2 | cut -d "]" -f1 

所以确切的解决方案是

# cat /sys/block/sdb/queue/scheduler | cut -d "[" -f2 | cut -d "]" -f1 
0

另一种可能的解决方案是AWK:

​​
0

另一种方式通过GNU的grep:

grep -Po "\[\K[^]]*" file 

纯壳:

while read line; do [[ "$line" =~ \[([^]]*)\] ]] && echo "${BASH_REMATCH[1]}"; done < file 
0

另一个awk

echo 'noop anticipatory deadline [cfq]' | awk '{gsub(/.*\[|\].*/,x)}8' 
cfq 
0
perl -lne 'print $1 if(/\[([^\]]*)\]/)' 

测试here

相关问题