使用sed从特定对分隔符之间获取文本

使用sed从特定对分隔符之间获取文本,sed,awk,Sed,Awk,我是第一次使用sed,所以它甚至可能不是适合这项工作的工具,但在广泛的谷歌搜索之后,它似乎是可以完成这项工作的工具。我的问题是我有一个数据文件,我需要从中提取一些数据并丢弃其余的数据 样本数据 #Ranger (62:0) Device pose: (0, 0, 0), (0, 0, 0) Device size: (0, 0, 0) Configuration: Minimum angle: 0 Maximum angle: 0 Angular resolution: 0

我是第一次使用sed,所以它甚至可能不是适合这项工作的工具,但在广泛的谷歌搜索之后,它似乎是可以完成这项工作的工具。我的问题是我有一个数据文件,我需要从中提取一些数据并丢弃其余的数据

样本数据

    #Ranger (62:0)
Device pose: (0, 0, 0), (0, 0, 0)
Device size: (0, 0, 0)
Configuration: 
Minimum angle: 0    Maximum angle: 0    Angular resolution: 0
Minimum range: 0    Maximum range: 0Range resolution: 0
Scanning frequency: 0
682 range readings:
  [0.529, 0.524, 0.511, 0.506, 0.505, 0.505, 0.505, 0.505, 0.505, 0.503, 0.495, 0.483, 0.471, 0.469, 0.469, 0.469, 0.469, 0.465, 0.458, 0.458, 0.454, 0.454, 0.454, 0.45, 0.443, 0.442, 0.442, 0.443]
    #Ranger (62:0)
Device pose: (0, 0, 0), (0, 0, 0)
Device size: (0, 0, 0)
Configuration: 
Minimum angle: 0    Maximum angle: 0    Angular resolution: 0
Minimum range: 0    Maximum range: 0Range resolution: 0
Scanning frequency: 0
682 range readings:
  [0.529, 0.524, 0.511, 0.506, 0.505, 0.505, 0.505, 0.505, 0.505, 0.503, 0.495, 0.483, 0.471, 0.469, 0.469, 0.469, 0.469, 0.465, 0.458, 0.458, 0.454, 0.454, 0.454, 0.45, 0.443, 0.442, 0.442, 0.443]
这种模式重复了好几次。 我想要的数据介于[和]之间。我想要所有[]对之间的所有数据。 我尝试了一些sed脚本,包括一个作为一个非常类似问题的解决方案发送的脚本,但没有效果。剧本

sed -n -e '/\[[^]]/s/^[^[]*\[\([^]]*\)].*$/\1/p' <a.txt >b.txt
这与我想要达到的目标正好相反。有人能帮忙吗?
抱歉解释得太长。

这可以通过
grep轻松完成:

user@machine:~/tmp$ grep '\[' data
  [0.529, 0.524, 0.511, 0.506, 0.505, 0.505, 0.505, 0.505, 0.505, 0.503, 0.495, 0.483, 0.471, 0.469, 0.469, 0.469, 0.469, 0.465, 0.458, 0.458, 0.454, 0.454, 0.454, 0.45, 0.443, 0.442, 0.442, 0.443]
  [0.529, 0.524, 0.511, 0.506, 0.505, 0.505, 0.505, 0.505, 0.505, 0.503, 0.495, 0.483, 0.471, 0.469, 0.469, 0.469, 0.469, 0.465, 0.458, 0.458, 0.454, 0.454, 0.454, 0.45, 0.443, 0.442, 0.442, 0.443]
如果要将输出存储在新文件中,只需重定向:

user@machine:~/tmp$ grep '\[' data > extracted_values.dat

这可以通过
grep
轻松完成:

user@machine:~/tmp$ grep '\[' data
  [0.529, 0.524, 0.511, 0.506, 0.505, 0.505, 0.505, 0.505, 0.505, 0.503, 0.495, 0.483, 0.471, 0.469, 0.469, 0.469, 0.469, 0.465, 0.458, 0.458, 0.454, 0.454, 0.454, 0.45, 0.443, 0.442, 0.442, 0.443]
  [0.529, 0.524, 0.511, 0.506, 0.505, 0.505, 0.505, 0.505, 0.505, 0.503, 0.495, 0.483, 0.471, 0.469, 0.469, 0.469, 0.469, 0.465, 0.458, 0.458, 0.454, 0.454, 0.454, 0.45, 0.443, 0.442, 0.442, 0.443]
如果要将输出存储在新文件中,只需重定向:

user@machine:~/tmp$ grep '\[' data > extracted_values.dat

也许这就是你想要的:

sed -nr 's/\s*\[([^\]+)\]/\1/p'

也许这就是你想要的:

sed -nr 's/\s*\[([^\]+)\]/\1/p'

根据您的数据,似乎您只需要在
[]
中获取这些内容,而没有其他行包含
[]
。这里有一些其他的方法

$ awk '/\[/{ gsub(/\[|\]/,"");print}' file
它表示搜索
[
并打印行,同时删除括号(如果需要括号,请删除
gsub
语句)

$ ruby -ne 'print if /\[/' file 

使用
grep

$ grep "\[" file
如果您坚持
sed

$ sed -n '/\[/p' file

根据您的数据,似乎您只需要在
[]
中获取这些内容,并且没有其他行包含
[]

$ awk '/\[/{ gsub(/\[|\]/,"");print}' file
它表示搜索
[
并打印行,同时删除括号(如果需要括号,请删除
gsub
语句)

$ ruby -ne 'print if /\[/' file 

使用
grep

$ grep "\[" file
如果您坚持
sed

$ sed -n '/\[/p' file

尝试用[]环绕字符,即[谢谢。我按照你的建议做了,但仍然没有成功。所有的在线教程都建议它应该可以工作,这真是令人费解。我有时间检查一下。在我复制了你的b.txt文件并扩展了它之后,我不得不使用rem,/rem对,它确实起了作用,我得到了两行CSV数据输出,正如我们预期的那样。我已经看到各种版本的sed都有p方面的问题处理/pat1/,/pat2/范围。您也可以尝试反向sed命令(仅打印不在范围内的行)…sed-n'/pat1/,/pat2/!p'b.txt>c.txt。(这在我的sed中也起作用)。另外,其他人提供的grep解决方案似乎符合您的规范,而且麻烦少了很多。最后,sed的操作系统和版本是什么(AIX?,哈!难怪).祝你好运!我是刚安装Ubuntu 10.10的*NIX环境的新手。它有GNU sed版本4.2.1。我尝试了反向sed命令,但仍然没有成功,但感谢您的帮助,并对所有的麻烦表示抱歉:)尝试用[]环绕字符,即[谢谢。我按照你的建议做了,但仍然没有成功。所有的在线教程都建议它应该可以工作,这真是令人费解。我有时间检查一下。在我复制了你的b.txt文件并扩展了它之后,我不得不使用rem,/rem对,它确实起了作用,我得到了两行CSV数据输出,正如我们预期的那样。我已经看到各种版本的sed都有p方面的问题处理/pat1/,/pat2/范围。您也可以尝试反向sed命令(仅打印不在范围内的行)…sed-n'/pat1/,/pat2/!p'b.txt>c.txt。(这在我的sed中也起作用)。另外,其他人提供的grep解决方案似乎符合您的规范,而且麻烦少了很多。最后,sed的操作系统和版本是什么(AIX?,哈!难怪).祝你好运!我是*NIX环境的新手,最近刚安装了Ubuntu 10.10。它有GNU sed版本4.2.1。我尝试了反向sed命令,但仍然不走运,但感谢您的帮助,并对所有的麻烦表示抱歉:)谢谢你的回答,它们正是我想要的。我最近刚安装了Ubuntu 10.10,所以我对*NIX环境非常陌生。我没有尝试ruby命令,但其他命令正是我想要的。谢谢你的回答,它们正是我想要的。我刚安装了Ubuntu 10.10,所以我对*NIX环境非常陌生环境。我没有尝试ruby命令,但其他命令正是我想要的。谢谢你的答案,它完成了任务。现在看到答案大约三个字符,我感到非常愚蠢:)谢谢答案,它完成了任务。现在看到答案大约三个字符,我感到非常愚蠢:)谢谢答案。它完成了任务工作做得很好,正是我想要的。谢谢你的回答。工作做得很好,正是我想要的。