Regex Linux sed-删除单词不以特定字符开头
如何通过Regex Linux sed-删除单词不以特定字符开头,regex,linux,bash,sed,Regex,Linux,Bash,Sed,如何通过sed删除不以特定字符开头的单词 样本: echo "--foo imhere -abc anotherone" | sed ... 结果必须是 "--foo -abc" 您可以使用ssed启用PCRE正则表达式,然后您可以使用这个: (?<!-)\b\w+ (? echo "--foo imhere -abc anotherone" | ssed 's/(?<!-)\b\w+//' echo”--foo imhere-abc anotherone“| ssed的
sed
删除不以特定字符开头的单词
样本:
echo "--foo imhere -abc anotherone" | sed ...
结果必须是
"--foo -abc"
您可以使用
ssed
启用PCRE正则表达式,然后您可以使用这个:
(?<!-)\b\w+
(?
echo "--foo imhere -abc anotherone" | ssed 's/(?<!-)\b\w+//'
echo”--foo imhere-abc anotherone“| ssed的/(?
只有当第一个单词可能出错时,才需要使用first和last-e命令。gnu与-r
一起使用:
kent$ echo "--foo imhere -abc anotherone" | sed -r 's/^|\s[^-]\S*//g'
--foo -abc
然而,我更喜欢awk来解决它,更简单:
awk '{for(i=1;i<=NF;i++)$i=($i~/^-/?$i:"")}7'
如果第一个“单词”是错误的,它不会删除它。echo“xxx--foo imhere-abc anotherone”|…
是否可以使用相同的模式\S*//g'
与mac OSX sed一起使用?@LajosVeres是的,你是对的,你的解决方案也可以在mac OSX中使用。@Sezen不知道bsd sed的ERE选项。正如Lajos Veres所评论的,如果第一个单词不是以-
sed-r'S/(^\S)[^-]\S*//g'
可以快速修复,但仍然不完美。我建议您使用awk单行程序,简单易懂。您awk
将为删除的字段留下大量额外空间。这awk'{(i=1;你能解释一下模式的含义吗?我接受这个解决方案作为答案,因为它也适用于BSD sed,但模式能更简单吗?谢谢。中间模式做主要工作。它删除所有以空格开头的子字符串,后跟坏字符,直到给定单词的结尾。不幸的是,如果整个字符串以一个坏单词开头,这就是为什么我在第一个模式的开头添加了一个额外的空格,并在最后一个模式中删除它。我没有找到一种方法来节省第一个/最后一个步骤,但在理论上类似的方法可以工作:的/(^ |*)[^-][^]*//g'
,但它需要更多的调整。
awk '{for(i=1;i<=NF;i++)$i=($i~/^-/?$i:"")}7'
--foo -abc