Используя sed для удаления строки или абзаца между разделителем

Я не могу просмотреть изображение, которое Вы отправили выше, но если это - связанное с сетью, я предполагаю, что проблема могла бы идти с драйвером Wi-Fi.

Dell Inspiron 1464 идет с беспроводной картой Broadcom, вероятно, BCM4312, который имеет плохую поддержку драйвера Linux. Я испытал подобную панику ядра. Мой совет состоит в том, чтобы купить некоторую другую беспроводную карту (такую как Intel 5100, который я использую) заменять это.

3
10.03.2015, 16:55
3 ответа

Сделать это для однострочных строк очень просто:

sed 's/((([^)]*)))//g' file

Если вам нужно иметь дело с многострочными, это становится сложнее. Один из подходов заключается в использовании tr для замены всех новых строк нулевым символом (\0), в замене и обратном переводе:

tr '\n' '\0' < file | sed 's/((([^)]*)))//g' | tr '\0' '\n'

В качестве альтернативы можно просто использовать perl:

perl -0pe 's/\(\(\([^)]+\)\)\)//g;' file

-0 заставляет perl читать весь файл в память (это может быть проблемой для огромных файлов), -p означает "распечатывать каждую строку", но из-за -0, "строка" на самом деле является всем файлом. Идея s/// та же самая, что и для sed.

1
27.01.2020, 21:19

Попробуйте

sed 's/((([^)]*)))//' file

или, вероятно, даже лучше в вашем предложении

sed 's/ ((([^)]*)))//' file
1
27.01.2020, 21:19
sed -e :p -e '/(((/!b     
'   -e :n -e 's/)))/\     
/;            s/(((.*\n//; tp
$d;N;         s//(((/;     tn'

Это должно сработать. При этом b ranch away (и, соответственно, автопечать) любые строки, не совпадающие с ((((), но после нахождения пытаются удалить все между первой происходящей последовательностью (((() и первой происходящей ))). Если не может, потому что трейлинг )) не найден на текущей строке, то он тянет за внешнюю строку Next, удаляет все между ((() и заголовком следующей строки, и снова ищет. Если она доходит до конца последней строки $при поиске ))), то она отступает. Таким образом, он никогда не буферизирует больше, чем строка за раз, так как удаляет все, что следует за ((() каждый раз, когда ему приходится втягивать новую строку.

Она должна обрабатывать столько пар ((( )), сколько может произойти на линии - и не имеет значения, если между двумя концами возникнет какое-либо ( или ) - она будет искать прошедшие 2 или менее ) и любое число (.

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

  1. :p - объявите метку ветки p. Здесь ветки скрипта, если он может заменить последовательность )) на новую строку, а затем удалить все между (((( и \n.
  2. /(((/!b - b ranch away - и пространство шаблона автопечати - если в пространстве шаблона нет оставшихся ((( последовательностей.
  3. :n - объявите ветку : метка n. Здесь ветки сценария, если ((() найдена, но )) не могут быть найдены на одной и той же строке.
  4. s/)))/\n/ - замена первого появления ))) на новую строку. Это происходит только в том случае, если ((() уже было найдено совпадение.
  5. s/(((.*\n// - замените все между первым (((() и единственным \n в пространстве шаблонов.
  6. tp - test для успешной замены; если верно, то ветка для обозначения :p.
  7. $d;N - последняя замена не прошла успешно; если текущая строка является $последней delete, в противном случае добавьте Next к шаблону пространства.
  8. s//((/;tn - повторите последний регенерат и замените все между первым происходящим ((() и только что добавленной новой строкой для ((((), а затем веткой для метки :n.
2
27.01.2020, 21:19

Теги

Похожие вопросы