使用awk或sed删除txt中的模式
我试图从一些文本中删除一个模式。我的意思是: 从使用awk或sed删除txt中的模式,awk,sed,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],[142647048
[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.
您可以使用
grep
$ grep -oP ',\K[^\]\[]*(?=\])' file
19.44
19.44
19.38
19.38
19.38
19.38
19.38
19.38
这个正则表达式将获取方括号内的最后一个字符串
匹配第一个逗号,
丢弃先前匹配的字符逗号\K
与任何字符(但不是[^\]\[]*
或]
的字符)匹配的求反字符类,零次或多次[
正向前瞻,断言匹配后必须跟一个(?=\])
字符]
- 使用
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
这使得记录分隔符末尾的逗号是可选的。此grep行应该可以:
grep -oP '[^,]*(?=])'
简而言之,这一行提取、
和]
之间的文本,这是您想要的内容。sed
sed 's/\[[^,]\+,\([^]]\+\)\]/\1/g; s/,/\n/g'
第一个正则表达式查找:一个文本开括号、一些非逗号字符、一个逗号、捕获括号、一些非闭括号字符、结束捕获和一个文本闭括号。它用捕获的文本替换所有这些内容。然后,用换行符替换剩余的逗号。一个
awk
备选方案:
awk '$0~FS{print $1}' RS=',' FS=']' inputfile
RS=”,”
:将“RecordS分隔符更改为逗号
FS=']
:将FieldSeparator设置为]
$0~FS
:如果当前记录中存在FS
,则打印第一个字段(在输出中避免FS)您也可以使用sed和coreutils:
<infile tr -d '][' | tr , '\n' | sed '1d; n; d'
解释
tr
删除括号并用换行符替换逗号sed
然后删除第一行以及之后的每一行。对于多字符的GNU awk:
$ awk -v RS='[]],[[\n]' -F, '{print $2}' file
19.44
19.44
19.38
19.38
将保留最后一个
]
否,两个命令的输出相同,并且都按照预期输出数字-使用问题中的示例数据。抱歉,我没有看到最后一个逗号,我的问题是没有问题。将,
附加到列表中并不少见,这将使writer的实现变得更容易。@JID已经更改了awk命令。现在它解决了您的问题。
$ awk -v RS='[]],[[\n]' -F, '{print $2}' file
19.44
19.44
19.38
19.38