удалить часть строки, содержащуюся в двух разных типах разделителей / разделителей

Большинство инструментов командной строки, на которые я смотрю, имеют возможность выбирать разделитель полей. Тем не менее, я хотел бы выбрать один разделитель для начала, а другой – для завершения сегмента текста, который я хотел бы удалить из каждой строки, которую я обрабатываю.

1text [blah blah blah] text number punctuation text text 2text text text 3text text (text) [blah blah blah] number text 4text <url> <email> text [blah blah blah] text 

Я хотел бы удалить все «бла-бла-бла» из этих строк.

Бла может содержать что угодно, кроме линий новой строки, EOF и других промахов, и '['. т.е.: я не должен иметь [['(и' [blah [') в любой из данных

У меня есть только один (необязательный) экземпляр [] для каждой строки. Таким образом, для строки 2 ничего не удалять, и это не должно приводить к остановке, остановке или сбою.

Я почти на 100% уверен, что, если у меня есть старт »[« У меня тоже есть »]. Однако это может быть приятно проверить.

Существуют и другие формы пунктуации, поэтому я не хочу работать с чем-то, что просто ищет ненулевое число, чтобы начать удаление (то есть: строка 4)

Бонусные баллы за то, что они могут понять, собираю ли я два (сейчас смежных) пробела в этой конкретной точке, но не удаляя двойные пробелы в любой другой точке.

Я почти уверен, что мне придется использовать awk или sed, но если бы был способ сделать это с помощью обычных инструментов командной строки, чтобы сделать его максимально переносимым, это было бы идеально.

Кроме того, объяснение того, что вы делаете (если вы используете regex / sed), несомненно, поможет:


Предложение здесь говорит:

 sed 's/^.*%\([^ ]*\) .*\$\([^$]*\)$/\1 \2/' infile 

У меня есть такая работа, которая работает с этим обезьянником:

 cat data | sed 's/^.*\[\([^ ]*\) .*\]\([^$]*\)$/\1 \2/' 

Однако он не вынимает всю полосу «бла-бла-бла» и уходит с дополнительным перерывом.


Использование cut / awk / sed с двумя разными разделителями

На самом деле не отвечает на этот вопрос в общем смысле (или, по крайней мере, я не смог понять что-то после его прочтения – может быть, просто провал с моей стороны), но, похоже, он тоже был специально приспособлен к тому, данные.

Это очень просто. Вам не нужны разделители как таковые, это простое регулярное выражение. Просто найдите открытие [ , за которым следует некое число ] или [ символы как можно до конца строки. Например:

  1. Perl

    Если вы знаете, что нет [[ или других странных вещей:

     perl -pe 's/\[.+?\]//g' file 

    Если у вас могут быть странные вещи:

     perl -pe 's/\[[^\[\]]*\]//g' file 
  2. СЕПГ

     sed 's/\[[^]]*\]//g' file