我想从文本文件中删除任何包含非alpha字符的单词。例如

"ok 0bad ba1d bad3 4bad4 5bad5bad5"

应该变成
"ok"

我试过用
echo "ok 0bad ba1d bad3 4bad4 5bad5bad5" | sed 's/\b[a-zA-Z]*[^a-zA-Z]\+[a-zA-Z]*\b/ /g'

最佳答案

使用awk

s="ok 0bad ba1d bad3 4bad4 5bad5bad5"
awk '{ofs=""; for (i=1; i<=NF; i++) if ($i ~ /^[[:alpha:]]+$/)
         {printf "%s%s", ofs, $i; ofs=OFS} print ""}' <<< "$s"
ok

这个awk命令循环遍历所有单词,如果word与regex/^[[:alpha:]]+$/匹配,则它将写入standard out。(i<NF)?OFS:RS是添加OFS的捷径,如果当前字段no小于NF,否则它将写入RS
同时使用grep+tr
s="ok 0bad ba1d bad3 4bad4 5bad5bad5"
r=$(grep -o '[^ ]\+' <<< "$s"|grep '^[[:alpha:]]\+$'|tr '\n' ' ')
echo "$r"
ok

首先grep -o将字符串分解为单个单词。第二个grep只搜索带有字母的单词。最后tr\n转换成空间。

关于linux - sed:删除包含字符类的整个单词,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25158710/

10-13 05:31