Я хочу удалить строку после совпавшего слова в 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 . Как этого добиться?

2 ответа2

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 (включая завершающий пробел) буквально ничем, эффективно удалив ее.

0
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 - правильный путь, но я не понимаю, как этого добиться. В моем случае я могу взять пространство в качестве разделителя.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .