如何使用 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时,在命令之后,它仍然包含括号

我试图在这里搜索一些替代方案,但找不到工作。

有什么建议吗?谢谢

您没有获得预期的输出,因为

  • 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(.*)
  • 捕获

尝试:

$ 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

如果输入行不仅仅是您的[...]令牌,那么我建议 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

你可以试试这个。

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

最新更新