我需要删除仅包含从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)或?
有关有什么建议吗?
答案 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有grep
和sed
的不同实现,所以这可能不会完全相同。
更安全(且更简单)的方法是首先将文件转换为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'
使用上述模式应找到仅包含数字的行并删除它们。