如何在 bash 中删除匹配单词后的字符串?

如何在 bash 中删除匹配单词后的字符串?

我想在 bash 中删除匹配的单词后的字符串。

认为:

eth0      Link encap:Ethernet-12 HWaddr 94:EE:88:00:FA:AA

我想encap:Ethernet-12从此行中删除。

它应该变成像eth0 Link HWaddr 94:EE:88:00:FA:AA。如何实现呢?

答案1

sed -r 's/(eth0 Link )[^ ]+ /\1/'

慢动作:

  • 匹配eth0 Link(带有最后一个空格)并保留它
  • 匹配任何连续的非空格(因此,下一个单词)
  • 匹配额外的空格
  • 用第一个匹配中保留的字符串替换全部

    ~>echo "eth0 Link encap:Ethernet-12 HWaddr 94:EE:88:00:FA:AA" | sed -r 's/(eth0 Link )[^ ]+ /\1/'                                    
    eth0 Link HWaddr 94:EE:88:00:FA:AA
    

encap是否可以通过搜索然后替换其后的字符串直至空格来实现?

是的。此过滤器

sed -r 's/encap[^ ]+ //'

将用毫无意义的内容替换该encap部分(包括尾随空格),从而有效地将其删除。

答案2

after searching a lot found one silly solution.
replace space with newline and again replace newline with space. Sorry for such bad solution but if we know space is separator, we can use it.

   #var=`echo "eth0 Link encap:Ethernet-12 HWaddr 94:EE:88:00:FA:AA" | tr " " "\n" | egrep -v "encap" | tr "\n" " "`
    #echo $var
    eth0 Link HWaddr 94:EE:88:00:FA:AA

我知道 sed 是正确的方法,但我不知道如何实现它。在我的例子中,我可以使用空格作为分隔符。

相关内容