从bash中的TXT文件中删除某些字符或关键字

时间:2017-07-15 13:32:00

标签: bash text grep

我想知道是否有办法从文本文件中删除某些关键字,比如说我有一个带有行的大文件

My name is John

My name is Peter

My name is Joe

是否有办法删除" 我的名字是"没有删除整行?这可以用grep以某种方式完成吗?我试图找到一个解决方案,但几乎所有我遇到的只是专注于删除整行。即使我可以删除文本直到某一列,这将解决我的问题。

5 个答案:

答案 0 :(得分:2)

您需要sedawk等文字处理工具来执行此操作,而不是grep

试试这个: sed 's/My name is//g' file

修改

grep的目的:

$ man grep | grep -A2 DESCRIPTION
DESCRIPTION
   grep  searches the named input FILEs (or standard input if no files are named, or if a single hyphen-minus (-) is given as file name) for lines containing a
   match to the given PATTERN.  By default, grep prints the matching lines.

答案 1 :(得分:2)

使用GNU grep:

grep -Po "My name is\K.*" file

带有前导空格的输出:

 John
 Peter
 Joe
  

-P:将PATTERN解释为Perl正则表达式

     

-o:仅打印匹配行的匹配(非空)部分,每个此类部分位于单独的输出行上。

     

\K:在\K之前删除匹配的部分。

答案 2 :(得分:1)

再尝试一个简单的grep。

grep -o '[^ ]*$'   Input_file

-o将仅打印匹配的行部分,现在在正则表达式中,它将查找从最后一个空格到最后一行的文本。

答案 3 :(得分:0)

首先删除空的awk解决方案 行,然后打印最后一个字段。

awk '!/^$/{print $NF}' file

John
Peter
Joe

答案 4 :(得分:0)

使用cut

cut -d' ' -f4 input_file

GNU cut具有补充选项,用于删除 -f指定的区域。如果 input_file 具有诸如“我的名字是John Doe ”之类的姓氏,则前面的代码将打印“ John ”,这将打印“ John Doe “:

cut --complement -d' ' -f1-3 input_file
与其他工具相比,

cut需要更少的内存:

# these numbers will vary by *nix version and disto...
wc -c `which cut sed awk grep` | head -n -1 | sort -n
  43224 /usr/bin/cut
 109000 /bin/sed
 215360 /bin/grep
 662240 /usr/bin/awk