使用awk或sed删除文本中的模式

时间:2015-03-18 10:25:38

标签: awk sed

我正在尝试从某些文本中删除模式。我的意思是:

[1426467605000,19.44]19.44

这是我的输入文本文件:

[1426467605000,19.44],[1426467965000,19.44],[1426468325000,19.38],[1426468685000,19.38],[1426469045000,19.38],[1426469405000,19.38],[1426469764000,19.38],[1426470124000,19.38],[1426470484000,19.38],[1426470845000,19.31],[1426471205000,19.31],[1426471565000,19.31],[1426471925000,19.31],[1426472285000,19.31],[1426472645000,19.31],[1426473005000,19.31],[1426473365000,19.31],[1426473725000,19.31],[1426474085000,19.31],[1426474445000,19.25],[1426474805000,19.25],[1426475164000,19.25],[1426475524000,19.25],[1426475884000,19.55],[1426476245000,19.25],[1426476605000,19.25],[1426476965000,19.25],[1426477325000,19.25],[1426477685000,19.19],[1426478045000,19.19],[1426478405000,19.19],[1426478764000,19.19],[1426479124000,19.19],[1426479484000,19.19],[1426479844000,19.19],[1426480204000,19.13],[1426480564000,19.13],[1426480924000,19.19],[1426481284000,19.19],[1426481644000,19.19],[1426482005000,19.19],[1426482365000,19.19],[1426482725000,19.19],

这是我想要的输出:

19.44
19.44
19.38
19.38
19.38
etc.

7 个答案:

答案 0 :(得分:4)

这个grep行应该这样做:

grep -oP '[^,]*(?=])'

简而言之,此行提取,]之间的文字,这是您想要的内容。

答案 1 :(得分:3)

使用grep

grep -oE '[0-9]+\.[0-9]+' file

模式搜索一个或多个数字,后跟一个点,再一个或多个数字。

-o使grep输出仅匹配,而不是输出匹配的整行。 -E允许我们使用posix扩展正则表达式,这使我们无法逃脱+


另一种方法是像这样使用awk

awk -F, '{print $2}' RS='\\[|\\],|\\],\\[' file

此命令执行更多语义分析,它返回记录中的第二个值。它按[(行首)或],],[分隔记录。它打印记录的第二个字段,其中字段由,分隔。

如果你想允许在最后没有,的情况下关闭一行的最后一条记录,你只需将模式修改为:

awk -F, '{print $2}' RS='\\[|\\],?|\\],\\[' file

使记录分隔符末尾的逗号可选。

答案 2 :(得分:2)

awk替代方案:

awk '$0~FS{print $1}' RS=',' FS=']' inputfile

RS=',':将 R ecord S eparator更改为逗号。

FS=']':将 F ield S eparator设置为]

$0~FS:如果当前记录中存在FS 打印第一个字段(避免输出中的FS)

答案 3 :(得分:1)

您可以使用grep

$ grep -oP ',\K[^\]\[]*(?=\])' file
19.44
19.44
19.38
19.38
19.38
19.38
19.38
19.38

这个正则表达式将获取方括号内的最后一个字符串。

  • ,与第一个逗号匹配。
  • \K会丢弃之前匹配的字母逗号。
  • [^\]\[]*否定字符类,匹配任何字符但不匹配][,零次或多次。
  • (?=\])肯定前瞻,断言匹配必须后跟]个字符。

答案 4 :(得分:1)

SED

sed 's/\[[^,]\+,\([^]]\+\)\]/\1/g; s/,/\n/g'

第一个正则表达式查找:文字开括号,一些非逗号字符,一个逗号,捕获括号,一些非近括号字符,结束捕获和一个文字紧密括号。它用捕获的文本替换所有这些。然后,剩余的逗号将被换行替换。

答案 5 :(得分:1)

你也可以使用sed和coreutils:

<infile tr -d '][' | tr , '\n' | sed '1d; n; d'

输出:

19.44
19.44
19.38
19.38
19.38
  .
  .
  .

解释

tr删除括号并用换行符替换逗号。 sed然后删除第一行和之后的每一行。

答案 6 :(得分:0)

使用GNU awk进行多字符RS:

$ awk -v RS='[]],[[\n]' -F, '{print $2}' file
19.44
19.44
19.38
19.38