我被困住了 - 通过管道传输这样的文本文件:
cat file1.txt | sed '/^[0-9].*[0-9]$/d' > file2.txt
这个正则表达式捕获文本编辑器中的行,当我使用它删除同一文件中的所有空白行时它可以工作,所以我猜(Linux/Windows)换行格式没有问题。
我想知道为什么这不会删除这些行,或者如何才能做到这一点?
答案1
一些额外的注意事项:
sed '/^[0-9].*[0-9]$/d'
将无法删除包含单个数字的行(即使它们以数字开头和结尾)。
另请注意,在许多语言环境中,[0-9]
匹配的内容不只是0123456789
数字。如果您只想匹配这些,则需要[0123456789]
或[[:digit:]]
。
根据模式过滤行的更明显的命令是grep
。
cat
是连接命令。连接单个文件没有什么意义。
在这里,要解决所有这些问题并忽略任何前导或尾随空格字符(例如输入中的 MS-DOS 尾随回车符),您可以执行以下操作:
<file.txt.in grep -e '^[[:space:]]*[^[:digit:][:space:]]' \
-e '[^[:digit:][:space:]][[:space:]]*$' \
-e '^[[:space:]]*$' > file.txt.out
(即返回以非数字开头或结尾的行(在前导空格之后,或在尾随空格之前),或者全是空格。
或者:
<file.txt.in grep -vx '[[:space:]]*[[:digit:]]\(.*[[:digit:]]\)\{0,1\}[[:space:]]*' > file.txt.out
或者与 ERE 相同:
<file.txt.in grep -vxE '[[:space:]]*[[:digit:]](.*[[:digit:]])?[[:space:]]*' > file.txt.out
也就是过滤出去(with -v
) 以数字开头的行(可选),其余行以数字结尾,允许在开头和 ned 处有空格。
然而,这些可能无法删除诸如8xx<non-character>yy8
where<non-character>
是在当前语言环境中不形成有效字符的字节序列之类的行。但无论如何,对于这种非有效文本的行,您不能期望太多可移植性。
答案2
如果
cat file1.txt | sed '/^\s*$/d' > file2.txt
有效,但是
cat file1.txt | sed '/^[0-9].*[0-9]$/d' > file2.txt
不(尽管人们希望像前者一样工作);
考虑到输入文件可能包含 Windows 回车符,那么使用此命令可能更安全:
cat file1.txt | sed '/^[0-9].*[0-9]\(\r\|$\)/d' > file2.txt
这应该适用于所有情况,包括以 Linux 或 Windows 回车符结尾的行。