sed命令无法移除列表中带减号的字段问题求助
问题分析
你的sed命令s/ -[^ ]* / /g存在两个核心缺陷:
- 仅匹配前后都有单个空格的
-xxx字段,当两个-xxx字段连续时(比如-o=... -w=8),第一个字段被替换后会留下多个空格,导致第二个-xxx字段前的空格数量不满足正则要求,无法被匹配。 - 无法处理行首或行尾的
-xxx字段(比如字符串开头是-a=1 ...或结尾是... -b=2)。
解决方案
下面提供几种可靠的实现方式:
方式一:改进基础正则的sed命令
echo 'w=7 -o=... -w=8 -w=9 k=3 iop=0' | sed -e 's/^-[^ ]* //' -e 's/ -[^ ]*$//' -e 's/ -[^ ]* / /g' -e 's/ */ /g'
- 分步逻辑:
s/^-[^ ]* //:移除行首的-xxx字段s/ -[^ ]*$//:移除行尾的-xxx字段s/ -[^ ]* / /g:移除中间的-xxx字段s/ */ /g:合并所有连续空格为单个空格
方式二:使用扩展正则简化sed命令
echo 'w=7 -o=... -w=8 -w=9 k=3 iop=0' | sed -E 's/(^| )-[^ ]*($| )/ /g; s/^ +| +$//; s/ +/ /g'
- 逻辑说明:
(^| )-[^ ]*($| ):匹配所有位置的-xxx字段(行首、中间、行尾)s/^ +| +$//:清理开头和结尾的多余空格s/ +/ /g:合并连续空格
方式三:用awk直观处理字段
awk天生擅长处理空格分隔的字段,逻辑更清晰:
echo 'w=7 -o=... -w=8 -w=9 k=3 iop=0' | awk '{for(i=1;i<=NF;i++) if($i !~ /^-/) printf "%s ", $i} END{print ""}' | sed 's/ $//'
- 逻辑:遍历每个字段,仅保留不以
-开头的字段,最后清理结尾的多余空格。
内容的提问来源于stack exchange,提问作者PIETRO SPIZZO
相关产品推荐
相关产品推荐

