如何通过终端从文本文件中删除包含特定单词的行?


72

如何从文本文件中删除所有包含单词“ cat”和“ rat”的行?


这听起来像是一项家庭作业。请记住将您的答案归功于Askubuntu的好人。
zwets

那是大型项目的一部分,我是Linux环境的新手。
PersonX

Answers:


100

grep 方法

要创建文件副本而没有匹配“ cat”或“ rat”的行,可以使用grep反向(-v)和全字词选项(-w)使用。

grep -vwE "(cat|rat)" sourcefile > destinationfile

整个字选项可以确保它不会匹配catsgrateful例如。Shell的输出重定向用于(>)将其写入新文件。我们需要一个-E选项来启用(one|other)语法的扩展正则表达式。

sed 方法

或者,要删除就地行,可以使用sed -i

sed -i "/\b\(cat\|rat\)\b/d" filename

\b套字边界和d操作删除匹配斜杠之间表达的行。cat并且rat两者都与(one|other)我们显然需要用反斜杠转义的语法匹配。

提示:覆盖文件之前,请在sed-i操作员的情况下测试命令的输出。

(基于Sed-删除包含特定字符串的行


我想知道是否有办法既从源文件中删除又生成具有匹配项的文件。可能没有,但是很有用(例如,当文件变得太大时,您将根据内容进行拆分)。
Sridhar Sarnobat '16

1
@ Sridhar-Sarnobat哦,可以。使用tee和subshel​​ls复制标准输出。在一个过滤器中,在另一个过滤器中相反。T恤和亚壳层中的用例无关的证明使用证明这里:blog.g3rt.nl/...
gertvdijk


5

试试vim-way:

ex +"g/[cr]at/d" -scwq file.txt

0

考虑一下您是否有文件,file_name并且想要搜索鼠标,但是同时鼠标的几行中有其他单词,例如catand,rat并且您不想在输出中看到这些,因此一种方法是-

grep -r mouse file_name | grep -vE "(cat|rat)"

0

便携式外壳方式

在工作/bin/sh,这是dash在Ubuntu,以及kshbash。有点尴尬,您必须为case语句中的每个单词编写多个测试用例,但它们是可移植的。适用于单词在行中,行首,行尾或行中单独出现而忽略该单词可能是另一个单词的一部分的情况。

#!/bin/sh
line_handler(){
   # $1 is line read, prints to stdout
    case "$1" in
        cat|cat\ *|*\ cat\ *|*\ cat) true;; # do nothing if cat or rat in line
        rat|rat\ *|*\ rat\ *|*\ rat) true;; 
        *) printf "%s\n" "$1"
    esac
}

readlines(){
    # $1 is input file, the rest is words we want to remove
    inputfile="$1"
    shift

    while IFS= read -r line;
    do
        line_handler "$line" "$@"
    done < "$inputfile"
    [ -n "$line" ] && line_handler "$line" 
}

readlines "$@"

这是它的工作方式:

$ cat input.txt                                                                                                                                                        
the big big fat cat
the cat who likes milk 
jumped over gray rat
concat 
this is catchy
rat
rational
irrational
$ ./dellines.sh input.txt                                                                                                                                              
concat 
this is catchy
rational
irrational
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.