Sed命令继续抛出错误“无法识别的命令”

时间:2016-10-18 04:55:09

标签: unix sed grep

我在执行sed命令时遇到问题。我想首先知道sed命令是否真的在ksh脚本上工作。我使用putty作为执行ksh脚本的工具。

如果确实有效,我使用的命令是sed -e [^a-zA-Z0-9] <file>

我实际上是为grep grep [^a-zA-Z0-9] <file>执行此命令。

我的目标是在文本文件中获取所有特殊字符并将其返回到变量或其他文件。我正在为这个网站和所有其他网站搜索这个,但我从来没有找到任何真正适合我的网站。

2 个答案:

答案 0 :(得分:0)

您的脚本不是有效的sed脚本。由于缺乏引用,问题更加严重。

如果没有引号,shell会尝试将表达式[^a-zA-Z0-9]扩展为匹配文件名列表。如果你在当前目录中有名为,?的文件,那么即使在grep , ? <file>运行之前,glob也会扩展到grep(取决于你的shell&#) 39; s设置 - 如果没有匹配项,则使用shopt -s nullglob模式将消失。

sed的语法不同。要将正则表达式与sed匹配,请使用

sed '/[^a-zA-Z0-9]/' <file>

斜杠是可配置的;例如,如果你有一个包含斜杠的正则表达式,你可以使用一个不同的分隔符,前缀为反斜杠:

sed '\#[^a-zA-Z0-9/]#' <file>

如果您只想提取匹配的字符,请尝试grep -o - 再次注意正确引用您的变量。

chars=$(grep -o '[^a-zA-Z0-9]' <file>)
echo "$chars"  #  double quotes are *absolutely* *crucial*

再没有双引号,shell会尝试将*中的任何chars扩展为当前目录中的文件列表。

答案 1 :(得分:0)

sed是shell外部的二进制实用程序。你可以看到它的位置

$ which sed
/usr/bin/sed

你声明的目标是获得所有特殊的&#34;使用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`