我想找到放在括号中的字符串。我如何使用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
我想找到放在括号中的字符串。我如何使用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
它可以与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
这是一个有点乱,但基本上它是从文本块中[]
并打印回之间寻找。
太棒了!为我工作.. :) –
然后接受答案,请。 – Carlo
我找到了一个解决方案为可能
cut -d "[" -f2 | cut -d "]" -f1
所以确切的解决方案是
# cat /sys/block/sdb/queue/scheduler | cut -d "[" -f2 | cut -d "]" -f1
另一种可能的解决方案是AWK:
另一种方式通过GNU的grep:
grep -Po "\[\K[^]]*" file
纯壳:
while read line; do [[ "$line" =~ \[([^]]*)\] ]] && echo "${BASH_REMATCH[1]}"; done < file
另一个awk
echo 'noop anticipatory deadline [cfq]' | awk '{gsub(/.*\[|\].*/,x)}8'
cfq
perl -lne 'print $1 if(/\[([^\]]*)\]/)'
测试here
是否必须sed的?这种情况下'grep'似乎更好。 – fedorqui
我向所有选项开放。可以grep给我的字符串'cfq'? –