我想删除一行上带有特殊字符的三个词,例如
输入:
\cf4 \cb6 1749,1789 \cb3 \
输出:
1749,1789
我尝试了几个sed和grep语句,但到目前为止,都没有成功,主要是由于字符\
。
我失败的尝试:
sed -i 's/ [.\c ] //g' inputfile.ext >output file.ext
答案 0 :(得分:5)
Awk接受正则表达式字段分隔符(在这种情况下,是逗号或空格):
$ awk -F'[ ,]' '$0 = $3 "." $4' <<< '\cf4 \cb6 1749,1789 \cb3 \'
1749.1789
-F'[ ,]'
-使用集合space/comma
中的单个字符作为字段分隔符$0 = $3 "." $4
-如果我们可以将整行$0
设置为字段3 $4
,然后设置文字句点"."
,然后设置字段4 $4
,请执行默认行为(打印整行)如果该文件的每一行都具有相同的分隔符(空格/逗号)和字段数,请用<<< 'input'
替换file
。如果您输入的文件比您共享的样本复杂,请编辑问题以显示实际输入。
答案 1 :(得分:1)
反斜杠是使bash混淆的特殊元字符。
我们通过将其转义(就像您猜到的那样),将其与其他任何元字符一样对待!
但是首先,我们需要将此模式从文件中复制出来
grep '\\... \\... [0-9]+,[0-9]+ \\... \\' our_file # Close enough!
现在,只需剔除那些令人讨厌的反斜杠
| sed -e 's/\\//g' # Don't forget the g, otherwise it'll only strip out 1 backlash
现在,最后,找出2个alpha的簇,然后是一个数字和一个空格!
| sed -e 's/[a-z][a-z][0-9] //g'
最后,...
grep '\\... \\... [0-9]+,[0-9]+ \\... \\' our_file | sed -e 's/\\//g' | sed -e 's/[a-z][a-z][0-9] //g'
输出:
1749,1789
答案 2 :(得分:0)
我的猜测是您遇到了麻烦,因为输入中包含反斜杠,并且无法弄清楚如何将反斜杠添加到正则表达式中。由于反斜杠是shell和regex的转义字符,您最终必须输入四个反斜杠才能将一个反斜杠插入正则表达式中。
Ben Van Camp已经发布了一个答案,该答案使用单引号使转义变得容易一些;但是,我现在将发布一个可以完全避免问题的答案。
server.php
锁定到逗号并选择任一侧的数字并输出数字。或者,如果不能保证逗号,我们可以这样:
grep -o '[0-9]*,[0-9]*' | tr , .
这两个方法都假设每行只有一个可用数字。
答案 3 :(得分:-3)
$ awk '{sub(/,/,".",$3); print $3}' file
1749.1789
$ sed 's/\([^ ]* \)\{2\}\([^ ]*\).*/\2/; s/,/./' file
1749.1789