我有两个未排序的单词列表,我想生成一个新列表,不包括某些选定字符的单词,并且按顺序排列。我尝试了以下命令:
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
”(这是正确的,除非该行完全由字符h
、l
、r
或w
为空组成),而第二个命令是“查找包含集合中任何字符的行”设置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
.