删除以数字开头和结尾的行

删除以数字开头和结尾的行

我被困住了 - 通过管道传输这样的文本文件:

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>yy8where<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 回车符结尾的行。

相关内容