如何删除OS X中仅包含数字的行?

时间:2016-06-29 17:34:29

标签: bash awk sed

我需要删除仅包含从Windows计算机下载并存储在Mac上的文本文件中的数字的行。 我试过了

sed '/[A-Za-z]/!d' input-file > output-file

sed -n '/[[:alpha:]]/p'

其中任何一行都不会删除任何只有数字的行

当我尝试在

中使用awk时
awk '/[A-Za-z]/' input-file > output-file

它显然将输入文件视为二进制文件并生成二进制输出。

我想知道这是否与文本编码(ISO与UTF-8)或?

有关

有什么建议吗?

3 个答案:

答案 0 :(得分:3)

很多方法。这是一个:

sed -ne '/[^0-9]/p' infile >outfile

这表示不要自动打印任何行(-n),但要查找(//)具有非数字([^0-9])的行并打印它们( p)。

awk相同的想法:

awk '/[^0-9]/' infile >outfile

不幸的是,这两个人也会删除任何完全空行(甚至没有任何空格)。要包含这些内容,您必须执行以下操作:

# match lines that contain nothing or at least one non-digit
sed -ne '/[^0-9]/p' -e '/^$/p' infile >outfile
awk '/[^0-9]|^$/' infile >outfile

# match lines that aren't all digits
awk '!/^[0-9]*$/' infile >outfile 

但是,对于这种整行选择,使用grep更简单:

# match lines that aren't all digits
grep -v '^[0-9]*$' infile >outfile

仅打印-v)由所有数字(^[0-9]*$)组成的行。

答案 1 :(得分:1)

您想要删除仅包含数字的行。我假设你的意思是只包含十进制数字的行。

您还说该文件来自Windows计算机,您正在Mac上处理它。 Windows使用\r\n标记一行的结尾,因此如果您尚未转换文件,则要删除的行可能还包含尾随\r(CR)字符。

sed '/^[0-9]*\r\?$/d' input-file > output-file

\?表示\r是可选的,因此无论输入文件是Windows样式还是Unix样式的行结尾,甚至是混合,这都应该有效。它不会转换剩余的行,因此Windows格式的输入文件将生成Windows格式的输出文件。

类似的grep命令不起作用,可能是因为grep无法将\r识别为CR字符。我在Linux系统上进行了测试,MacOS有grepsed的不同实现,所以这可能不会完全相同。

更安全(且更简单)的方法是首先将文件转换为Unix格式,然后使用相同的sed命令而不使用\r\?

sed '/^[0-9]*$/d' input-file > output-file

或者您可以使用更简单的grep命令:

grep -v '^[0-9]*$' input-file > output-file

答案 2 :(得分:0)

您的第一个模式在技术上应该可以工作,但也会删除任何空行或换行符。第二种模式是搜索字母/字母字符,同时使用-n抑制输出。第三种模式只搜索字母/字母字符。

sed -E '/^[0-9]+$/d'

使用上述模式应找到仅包含数字的行并删除它们。