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

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

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

答案1

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——删除包含特定字符串的行

答案2

仅在终端中测试,请使用:

sed '/[cr]at/d' file_name

要真正从文件中删除这些行,请使用:

sed -i '/[cr]at/d' file_name

答案3

尝试使用ex命令(Vi/Vim 的一部分):

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

上述方法比其他工具更具优势,sed例如非标准 FreeBSD -i(就地)扩展在其他操作系统上可能无法使用。其次sed年代EDitor,不是文件编辑器

答案4

使用 awk 排除包含特定单词的行:

$ awk '!/\<(cat|rat)\>/{print $0}' ./input.txt

awk 语法:

  • !/regex/仅打印与正则表达式不匹配的行。
  • |替代运算符,用于指定替代项。
  • (...)分组,例如对交替运算符进行分组。
  • \<匹配单词开头的空字符串。
  • \>匹配单词末尾的空字符串。
  • {...}行動辯錄。

相关内容