我该如何使用sed删除一个文本文件中包含特定字符串的所有行?
我该如何使用sed删除一个文本文件中包含特定字符串的所有行?
SED:
'/James\|John/d'
:删除包含“James”或“John”的行。-n '/James\|John/!p'
:打印不包含“James”或“John”的行。AWK:
'!/James|John/'
:打印不包含“James”或“John”的行。/James|John/ {next;} {print}
:跳过包含“James”或“John”的行并打印其余行。GREP:
-v 'James\|John'
:打印不包含“James”或“John”的行。您也可以删除文件中的一系列行。例如,要删除 SQL 文件中的存储过程。
sed '/CREATE PROCEDURE.*/,/END ;/d' sqllines.sql
这将删除 CREATE PROCEDURE 和 END; 之间的所有行。
我使用这个 sed 命令清理了许多 sql 文件。
perl -i -nle'/regexp/||print' file1 file2 file3
perl -i.bk -nle'/regexp/||print' file1 file2 file3
第一条命令采用原地编辑的方式(-i)来编辑文件。
第二条命令也是同样的操作,但是会在文件名后面添加.bk(.bk可以替换成其他任何名称)以备份原始文件。
echo -e "/要删除的内容\ndd\033:x\n" | vim 需要编辑的文件.txt
有趣的是,被广泛接受的答案实际上并没有直接回答问题。这个问题询问如何使用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"
根据此页面上的其他描述进行变化。
如果有人想要精确匹配字符串,可以在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
-w,--word-regexp 仅选择包含形成整个单词的匹配项的行。
与-x,--line-regexp 仅选择完全匹配整行的匹配项。对于正则表达式模式,这就像将模式括在括号中,然后用^和$包围它。
- Sai在控制台中显示处理后的文本
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
命令将按一页一页的方式显示文本。
sed -i '/要删除的文本/d'
文件名,与 cat filename | sed '/要删除的文本/d'
相同。 - Martin Krungcat filename | grep -v "pattern" > filename.1
mv filename.1 filename
这个解决方案是用于对多个文件执行相同操作的。
for file in *.txt; do grep -v "Matching Text" $file > temp_file.txt; mv temp_file.txt $file; done
vim
而不是sed
,你可以使用ex
https://dev59.com/fm035IYBdhLWcg3wc_sm#33186317,但需要注意它的运行速度较慢。`vim` 的好处在于你可以使用\v<pattern>
来避免反斜线繁琐的问题。 - CervEd