我正在尝试将 Spoken 行上两个括号之间的所有信息删除到一个单独的文件中

I am trying to remove all info between the two brackets on the Spoken line into a separate file

我有一个包含一些值的 file.txt。我不确定如何从某一行的括号中提取信息。

这条线是 Oscar,我需要提取的信息在括号之间

Sonia = 0
Oscar = [191, 229, 115, 105, 0, 78, 154, 122, 210, 0]
EnableDebugConsole = true
Ralph = 99
Run = 0

如果我能在有和没有括号的情况下保存值,那就太好了,这样我以后就知道了。从这个网站上,我收集了一些示例并进行了尝试。

grep Oscar file.txt > file_remove.txt
cut -d \= -f 2 file_remove.txt | tr -d " \t\n\r" > file_brackets.txt
cat file_brackets.txt

[191,229,115,105,0,78,154,122,210,0]

即使这可能不是最好的方法,我仍然实现了我的目标之一并且我有信息

现在我该如何删除括号,这样我就可以让 file_no_brackets.txt 只包含括号之间的值,就像这样

191,229,115,105,0,78,154,122,210,0

您可以使用 sed 非常简单地完成它,例如

$ sed -n '/^Oscar/s/^[^[]*[[]\([^]]*\).*$//p' file
191, 229, 115, 105, 0, 78, 154, 122, 210, 0

说明

  1. sed -n 禁止打印图案 space

  2. /^Oscar/ 定位以 Oscar

  3. 开头的行
  4. 's/match/replace/ 标准 sed 替换匹配正则表达式 match 并将其替换为 replace

  5. 在替换中你有 /^[^[]* 匹配所有字符而不是 '['

  6. [[] 匹配 '['

  7. \([^]]*\) 捕获所有不是 ']' 的字符(剩余字符与 .*$ 匹配)

  8. replace</code> 这是一个 <em> 反向引用 </em> 替换为 [=28= 中捕获组中的文本] 以上.</p></li> <li><p><code>/p 打印 /^Oscar/ 和替换的匹配结果。

完成。

awk 救援!

$ awk -F'\[|\]' '/Oscar/{print }' file

将字段分隔符设置为右方括号或左方括号。找到该行并打印第一个和第二个字段分隔符(即字段 2)之间的文本。

以下 awk 也可以帮助您。

解决方案 1: 通过使用简单的搜索字符串 Oscar 并使用 gsub 实用程序全局替换使用提供的正则表达式。

awk '/Oscar/{gsub(/.*\[|\]/,"");gsub(/, /,",");print}'  Input_file

解决方案 2: 通过简单搜索字符串 Oscar 然后使用 match 函数 awk如下。

awk '/Oscar/{gsub(/, /,",");match([=11=],/\[.*\]/);if(substr([=11=],RSTART+1,RLENGTH-2)){print substr([=11=],RSTART+1,RLENGTH-2)}}'  Input_file

解决方案 3: 创建字段分隔符 ][ 并打印所需的适当字段。

awk -F"[][]" '/Oscar/{gsub(/, /,",",);print }'  Input_file

使用gawk

$ awk 'match([=10=],/^Oscar.*\[([^]]*)]/,arr){print arr[1]}' infile

测试结果:

$ cat infile
Sonia = 0
Oscar = [191, 229, 115, 105, 0, 78, 154, 122, 210, 0]
EnableDebugConsole = true
Ralph = 99
Run = 0

$ awk 'match([=11=],/^Oscar.*\[([^]]*)]/,arr){print arr[1]}' infile
191, 229, 115, 105, 0, 78, 154, 122, 210, 0

任何 awk

$ awk '/^Oscar/ && gsub(/^.*\[|\]/,"")' infile
191, 229, 115, 105, 0, 78, 154, 122, 210, 0

仅在需要时使用 grep

grep "Oscar = \[" file.txt | grep -o [0-9][^]]* >file_no_brackets.txt