如何从文本文件中删除所有不包含“@”的行?

How can I remove all lines not containing `@` from a text file?

我无法使这个或它的许多其他组合起作用:

sed -i '' '/@/!d' file.txt
sed -i '' '/\@/!d' file.txt
sed -n '/@/p' file.txt > newfile.tx

我错过了什么?

file.txt:

1. Lorem ip@sum dolor sit amet, consectetur adipiscing elit.
2. Nunc eu justo quis diam tempus auctor.
3. Suspe@ndisse in nulla et tellus aliquet finibus.
4. Aliquam @quis diam in tortor euismod faucibus ac lobortis massa.
5. Aenean feugiat nibh lobortis maximus pharetra.
6. Sed pharetra nibh id est lacinia, non pharetra nisi molestie.

sedawkgrep??? 删除所有不包含 @ 的行后的期望结果:

1. Lorem ip@sum dolor sit amet, consectetur adipiscing elit.
3. Suspe@ndisse in nulla et tellus aliquet finibus.
4. Aliquam @quis diam in tortor euismod faucibus ac lobortis massa.

更新

原来有 OS X 不喜欢的有趣的行尾。以下工作:

tr '\r' '\n' < file.txt | grep -F '@' > newfile.txt

感谢@TomFenech 为我指明了正确的方向。

你可以做到:

grep '@' file 

或使用 sed

sed -i '/@/!d' file

编辑

所以你的问题是,你在 sed 的 -i'' 之间添加了一个 space。有了这个 space,sed(用 gnu sed 测试)不会认为后面的 '' 是用于备份。此外,如果您有 -i 选项,则不需要重定向。它总是会给你一个空文件。

你也可以说:嘿,只打印那些包含 @:

的行
$ sed -n '/@/p' file
1. Lorem ip@sum dolor sit amet, consectetur adipiscing elit.
3. Suspe@ndisse in nulla et tellus aliquet finibus.
4. Aliquam @quis diam in tortor euismod faucibus ac lobortis massa.

看来你的真正问题是你的行尾,但我认为最好的解决方案是使用 grep-F 开关:

grep -F '@' file.txt

这会打印与固定字符串 @ 匹配的行(此处不需要正则表达式匹配)。

您可以像这样通过管道传输 tr 的输出:

tr -d '\r' < file.txt | grep -F '@'

这里我删除了回车returns,而不是换行。假设您的文件包含 DOS 样式的行结尾 \r\n,这可以防止将空行添加到文件中。

如果您的文件 只有 有回车 returns,那么您可以使用此选项将它们替换为换行符:

tr '\r' '\n' < file.txt | grep -F '@'