使用grep或sed删除一行中的单词

时间:2019-07-02 16:30:24

标签: bash sed grep

我想删除一行上带有特殊字符的三个词,例如

输入:

\cf4 \cb6 1749,1789 \cb3 \

输出:

1749,1789

我尝试了几个sed和grep语句,但到目前为止,都没有成功,主要是由于字符\

我失败的尝试:

sed -i 's/ [.\c ] //g' inputfile.ext >output file.ext

4 个答案:

答案 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