Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Linux sed-删除单词不以特定字符开头_Regex_Linux_Bash_Sed - Fatal编程技术网

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