如何从文本文件中删除所有包含特定字符串的行?

2314

我该如何使用sed删除一个文本文件中包含特定字符串的所有行?

21个回答

10

7

您也可以删除文件中的一系列行。例如,要删除 SQL 文件中的存储过程。

sed '/CREATE PROCEDURE.*/,/END ;/d' sqllines.sql

这将删除 CREATE PROCEDURE 和 END; 之间的所有行。

我使用这个 sed 命令清理了许多 sql 文件。


6
perl -i    -nle'/regexp/||print' file1 file2 file3
perl -i.bk -nle'/regexp/||print' file1 file2 file3

第一条命令采用原地编辑的方式(-i)来编辑文件。

第二条命令也是同样的操作,但是会在文件名后面添加.bk(.bk可以替换成其他任何名称)以备份原始文件。


4

echo -e "/要删除的内容\ndd\033:x\n" | vim 需要编辑的文件.txt

该命令用于在vim编辑器中删除文本文件中指定的内容。需要编辑的文件名为“需要编辑的文件.txt”,要删除的内容为“要删除的内容”。执行该命令后,vim编辑器会打开文件,并自动进行删除操作,然后保存并退出编辑器。

4

我发现大多数答案对我没有用,如果你使用vim,我发现这非常简单和直接:

:g/<pattern>/d

来源


如果你更喜欢使用 vim 而不是 sed,你可以使用 ex https://dev59.com/fm035IYBdhLWcg3wc_sm#33186317,但需要注意它的运行速度较慢。`vim` 的好处在于你可以使用 \v<pattern> 来避免反斜线繁琐的问题。 - CervEd

4

有趣的是,被广泛接受的答案实际上并没有直接回答问题。这个问题询问如何使用sed来替换一个字符串,但是答案似乎预设了将任意字符串转换为正则表达式的知识。

许多编程语言库都有一个函数来执行这样的转换,例如:

python: re.escape(STRING)
ruby: Regexp.escape(STRING)
java:  Pattern.quote(STRING)

但如何在命令行上执行呢?

由于这是一个sed相关的问题,一个方法是使用sed本身:

sed 's/\([\[/({.*+^$?]\)/\\\1/g'

假设我们有一个任意的字符串 $STRING,那么我们可以写出如下代码:

re=$(sed 's/\([\[({.*+^$?]\)/\\\1/g' <<< "$STRING")
sed "/$re/d" FILE

或者作为一行代码:
 sed "/$(sed 's/\([\[/({.*+^$?]\)/\\\1/g' <<< "$STRING")/d" 

根据此页面上的其他描述进行变化。


最后一个语法中的目标文件路径在哪里? - Sam Sirry

3

如果有人想要精确匹配字符串,可以在grep命令中使用-w标志来匹配整个单词。例如,如果您想删除具有数字11的行,但保留具有数字111的行:

-bash-4.1$ head file
1
11
111

-bash-4.1$ grep -v "11" file
1

-bash-4.1$ grep -w -v "11" file
1
111

如果你想一次性排除多个精确模式,它也可以在使用-f标志的情况下工作。如果“黑名单”是一个文件,其中每行都有几个要从“文件”中删除的模式:

grep -w -v -f blacklist file

1
有点误导性。-w,--word-regexp 仅选择包含形成整个单词的匹配项的行。-x,--line-regexp 仅选择完全匹配整行的匹配项。对于正则表达式模式,这就像将模式括在括号中,然后用^和$包围它。 - Sai

3

在控制台中显示处理后的文本

cat filename | sed '/text to remove/d' 

将处理后的文本保存到文件中。
cat filename | sed '/text to remove/d' > newfile

将处理后的文本信息追加到现有文件中。
cat filename | sed '/text to remove/d' >> newfile

处理已经处理过的文本,在这种情况下,移除更多被移除的行。

cat filename | sed '/text to remove/d' | sed '/remove this too/d' | more

| more 命令将按一页一页的方式显示文本。


1
使用-i选项可以直接编辑文件:sed -i '/要删除的文本/d' 文件名,与 cat filename | sed '/要删除的文本/d' 相同。 - Martin Krung

2
cat filename | grep -v "pattern" > filename.1
mv filename.1 filename

您正在覆盖一个正在使用中的文件。 - Davor Cubranic
@DavorCubranic 已修复。 - Andrey Izman

1

这个解决方案是用于对多个文件执行相同操作的。

for file in *.txt; do grep -v "Matching Text" $file > temp_file.txt; mv temp_file.txt $file; done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接