当行包含特定字符串时,如何从文件中删除该行?

当行包含特定字符串时,如何从文件中删除该行?

我有一个以逗号分隔的文件。我必须找到特定的文本,然后删除完整的行。

例如

123,aaa,bbb,888,8881
124,bbb,ccc,999,8881
125,ccc,ddd,888,8883

我必须删除包含 888 的行。

答案1

使用sed

sed '/888/d' filename

您可以使用-i选项来就地编辑文件,例如

sed -i.bak '/888/d' filename

笔记 : .bak将保留原始文件的备份。


假设您想删除包含888特定列的行,那么您需要使用,

awk -F"," '$4 != "888"' filename

答案2

使用grep

grep -vw '888' infile.csv > outfile.csv

如果您想就地编辑,

sed -i.bak '/\b888\b/d' infile.csv

编辑:

删除888仅包含第 4 列的行

sed -i.bak -r '/^(([^,]+,){3})888,/d' infile.csv

答案3

IMO,使用printf管道命令edsed -i.

printf '%s\n' 'g/,888,/d' 'w' | ed -s msalik.txt

第一个 argprintf告诉它打印由换行符 ( \n) 分隔的每个剩余参数。

最后两个论点实际上都不需要引用。我只是引用它们作为示例 - 有些ed命令需要引用。


为什么ed优于sed -i

与 不同的是edsed -i它不进行真正的就地编辑。它创建一个临时输出文件,然后将其重命名为原始文件。这有两个潜在的副作用:

  • umask由于创建临时文件所用的原因,文件的权限可能会更改。如果sed -i脚本由不同的用户运行(当然,该用户对文件和目录具有适当的 RW 访问权限),则即使所有权或组也可能会更改。

  • 替换文件将具有不同的索引节点。这将破坏硬链接。

相关内容