如何使用sed在两个特定字符([]括号)之间获取shell中的文本?

时间:2014-12-05 20:21:15

标签: linux shell sed

我尝试在shell中使用sed在两个特定字符之间获取shell中的文本,但它似乎无法工作。

我尝试从“[”和“]”

获取文字
[561:0:43:0] ->  561:0:43:0 

所以我尝试了如下

sed -e '/[/,/]/p' test > test2

测试内容例如:

[561:0:42:0]
[561:0:43:0] 
[561:0:478:0]
[561:0:48:0] 
[562:0:9:0]  

在我读取test2命令后,它仍包含括号

我试图在这里搜索一些替代品,但无法找到工作的东西。

有什么建议吗? 感谢

4 个答案:

答案 0 :(得分:1)

你没有得到预期的输出,因为

  • p命令打印整个模式空间,(或在sed命令中读取当前行)

您可以使用类似

的内容
$ sed -r 's/\[(.*)\]/\1/g' test
561:0:42:0
561:0:43:0
561:0:478:0
561:0:48:0
562:0:9:0 
  • s命令将[]内的任何内容替换为\1捕获组1的内容,由(.*)
  • 捕获

答案 1 :(得分:1)

尝试:

$ grep -o '[0-9:]*' <<< "[561:0:43:0]"
561:0:43:0

$ tr -d '[]' <<< "[561:0:43:0]"
561:0:43:0

$ awk -F'[][]' '{print $2}' <<< "[561:0:43:0]"
561:0:43:0

$ echo "[561:0:43:0]" | cut -d "[" -f2 | cut -d "]" -f1
561:0:43:0

击:

$ STR="[561:0:43:0]"
$ STR=${STR#*[}
$ STR=${STR%]*}
$ echo $STR
561:0:43:0

最后是一些perl:

$ perl -l -ne '/\[([0-9:]*)\]/ and print $1' <<< "[561:0:43:0]"
561:0:43:0

答案 2 :(得分:0)

如果输入行不仅仅是[...]令牌,那么我建议使用nu11p01n73R的答案。如果您的目标只是摆脱[],那么最简单的答案就是:

sed 's/[][]//g' test > test2

证明:

$ sed 's/[][]//g' <<EOF
> [561:0:42:0]
> [561:0:43:0] 
> [561:0:478:0]
> [561:0:48:0] 
> [562:0:9:0]
> EOF
561:0:42:0
561:0:43:0 
561:0:478:0
561:0:48:0 
562:0:9:0

答案 3 :(得分:0)

你可以试试这个。

sed -r 's/(\[)(.*)(\])/\2/g'