过滤具有 sed 上某些字符的行

过滤具有 sed 上某些字符的行

我有两个未排序的单词列表,我想生成一个新列表,不包括某些选定字符的单词,并且按顺序排列。我尝试了以下命令:

 cat roa7.lst gr7.usl | sed -e 's/\s/\n/g' | sed -n 's/[^hlrw]/&/p' | sort -u | less -N

但是,最后一个 sed 命令尝试排除包含字符集的行,但[hlrw]未能排除这些单词。不知怎的,我错过了分隔符内插入符号的实用性。我该如何修理这个管道?

答案1

最后一个命令的正确语法sed

sed -n '/[hlrw]/!p'

或者

sed '/[hlrw]/d'

大致相当。相应的awk程序将是

awk '!/[hlrw]/'

原始示例中的错误命令意味着“包含不在集合中的任何字符hlrw”(这是正确的,除非该行完全由字符hlrw为空组成),而第二个命令是“查找包含集合中任何字符的行”设置hlrw“,然后不打印它们;或“找到包含该集合的行hlrw”,并将它们从输入中删除。

答案2

但在这里,你不需要sed。你可以这样做:

grep -v '[hlrw]'

第一个(非标准)sed -e 's/\s/\n/g'也可以替换为:

tr -s '[:space:]' '[\n*]'

它将所有空格序列音译并压缩为换行符。

这实际上证明了使用 的合理性cat(这对于 来说不是必需的sed,因为sed可以将文件名作为参数并直接从中读取)。

因此,替代语法是

cat roa7.lst gr7.usl | tr -s '[:space:]' '[\n*]' | grep -v '[hlrw]' | sort -u | less -N

这完全避免了使用sed.

相关内容