sed 是您的 shell 外部的二进制实用程序。你可以看到它在哪里
$ which sed
/usr/bin/sed
您的既定目标是使用sed 和/或grep 从文本文件中获取所有“特殊”字符,其中特殊字符是不在集合 a-z、A-Z 或 0- 中的任何字符9.使用sed 最简单:
$ sed -e 's/[a-zA-Z0-9]//g' file
这会将所有非特殊字符替换为空字符,从而有效地将它们从文件中删除。使用/etc/passwd 作为输入的示例将输出类似于此的内容:
$ sed -e 's/[a-zA-Z0-9]//g' /etc/passwd
:::::/://
:::::/://
:::::/://
::::://://
:::::///://
:::::/://
:::::/://
:::::/://
:::::///://
:::::/://
::::://://
:::: ://://
:::::/://
:::::///://
-:::: :/://
-:::: :/://
-:::: :/://
--:::: :/://
对于grep,您可以使用-o 选项输出匹配值:
$ grep -o '[^a-zA-Z0-9]' /etc/passwd
这将产生类似的输出,但是,每个匹配的字符都会出现在新的一行中。
另一个选项是tr:
$ tr -d '[:alnum:]' </etc/passwd
这将产生与之前的sed 命令相同的输出。
在所有三种情况下,您都可以像这样捕获命令的标准输出:
$ specials=$(tr -d '[:alnum:]' </etc/passwd)
$ echo $specials
:::::/:// :::::/:// :::::/:// ::::://:// :::::///:// :::::/:// :::::/:// :::::/:// :::::///:// :::::/:// ::::://:// :::: ://:// :::::/:// :::::///:// -:::: :/:// -:::: :/:// -:::: :/:// --:::: :/:// :::: :/:// :::: :/:// :::: :///:// :::: :///:// ::::://:// :::: ://:// :::::/:// :::: :///:// :::::///:// :::: /- :///-:// :::::///:// :::: :///:// :::: :/:// :::::///:// ::::://:// -:::: :/:// :::: :/:// :::: ://:// :::: :/:// :::: :///:// :::: :///:// --::::://--/:// -:::: :/:// ::::- :///:// :::: ://:// :::::/:// ::::://:// ::::://:// :::: ://:// :::: :///:// :::: :///:// :::: :///://
使用反引号也可以:
$ specials=`tr -d '[:alnum:]' </etc/passwd`