我想找到放在括号中的字符串。我如何使用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 :(得分: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