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

时间:2015-05-05 10:50:07

标签: regex macos awk sed grep

我无法将此或其他许多组合用于:

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指出我正确的方向。

2 个答案:

答案 0 :(得分:4)

您还可以说:嘿,只需打印包含@的行:

$ 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.

答案 1 :(得分:4)

您的真实问题似乎与您的行结尾有关,但我认为最好的解决方案是将grep-F开关一起使用:

grep -F '@' file.txt

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

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

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

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

如果您的文件具有回车符,则可以使用此选项将其替换为换行符:

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