如何使用sed来识别括号中的字符串?

时间:2014-02-21 10:56:00

标签: regex 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

6 个答案:

答案 0 :(得分: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

它有点乱,但基本上它是从[]之间的文本块中查找并打印回来。

答案 1 :(得分:0)

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

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

所以确切的解决方案是

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

答案 2 :(得分:0)

另一个可能的解决方案是awk:

s='noop anticipatory deadline [cfq]'
awk -F'[][]' '{print $2}' <<< "$s"
cfq

答案 3 :(得分:0)

gnu grep的另一种方式:

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

纯壳:

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

答案 4 :(得分:0)

另一个awk

echo 'noop anticipatory deadline [cfq]' | awk '{gsub(/.*\[|\].*/,x)}8'
cfq

答案 5 :(得分:0)

perl -lne 'print $1 if(/\[([^\]]*)\]/)'

经过测试here