sed - удалить конкретный индекс из строки - PullRequest
0 голосов
/ 02 ноября 2011

, пожалуйста, предоставьте мне sed oneliner, который обеспечивает такой вывод: sdc3 sdc2 для ввода: sdc3 [1] sdc2 [0]

Я имею в виду удалить все значения индекса из строки ..

1 Ответ

4 голосов
/ 02 ноября 2011
sed 's/\[[^]]*\]//g'

читает: заменить любую строку литералом "[", за которым следует ноль или более символов, которые не являются "]", а затем закрывающим "]" пустой строкой.

Вам нужен бит [^]], чтобы жадное сопоставление не воспринималось как «[1] sdc2 [0]» как одиночное совпадение в строке образца.


Что касается вашего комментария:

sed 's#\([^[ ]*\)\[[^]]*\]#/dev/\1#g'
  • Я переключаю разделитель с обычного '/' на '#', просто чтобы избежать экранирования запрашиваемого вами бита /dev/ (я не буду говорить "для ясности")
  • бит \(...\) соответствует подгруппе, в данном случае sdc2 или как угодно, поэтому мы можем ссылаться на нее при замене
  • подгруппа использует класс символов, аналогичный тому, который мы использовали для отбрасывания индекса: [^[ ] означает любуюсимвол, кроме «[» (опять же, чтобы избежать жадного совпадения с индексом) или пробел (при условии, что ваши значения разделены пробелом согласно вашему сообщению)
  • замена теперь является литералом «/ dev /», за которым следуетпри первом (и единственном) совпадении подгруппы
  • флаг g в конце говорит it выполнить несколько совпадений в одной строке вместо остановки на первой
...