如何从文本文件中删除所有不包含“@”的行?
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.
在 sed
或 awk
或 grep
或 ???
删除所有不包含 @
的行后的期望结果:
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 '@'
我无法使这个或它的许多其他组合起作用:
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.
在 sed
或 awk
或 grep
或 ???
删除所有不包含 @
的行后的期望结果:
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 '@'