Arhn - архитектура программирования

Скрипт Linux SED находит первую строку, соответствующую шаблону, и удаляет ее

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

как я могу сделать это с sed?

например:

myline 1 is pretty
line 2 is ugly
myline 111 is nice

Я хочу удалить первую строку, содержащую «1 есть»

ОБНОВЛЕНИЕ: в моей строке могут быть такие символы, как "/" и "‹"

С уважением Фак


Ответы:


1

Я склонен использовать awk для более сложных задач, он немного мощнее, чем sed, имеет правильные конструкции циклов и выбора (расширен для удобства чтения, вы можете сжать его до одной строки, если хотите):

pax$ echo '
xyz
myline 1 is pretty
line 2 is ugly
myline 111 is nice'  | awk '
     /1 is/ {if (f) {print} else {f = 1}}
    !/1 is/ {print}'

xyz
line 2 is ugly
myline 111 is nice

Для любой строки, не соответствующей шаблону (!/1 is/), она просто печатается.

Для строк, которые соответствуют шаблону, печатаются все, если установлен флаг f (изначально он не установлен). Когда флаги не установлены и он встречает совпадающую строку, он устанавливает флаг и не печатает его. Это в основном удаляет первую совпадающую строку по желанию.

Если вы хотите изменить первую совпадающую строку, а не удалить ее, вы просто вставляете код рядом с f = 1, чтобы сделать это, например:

pax$ echo '
xyz
myline 1 is pretty
line 2 is ugly
myline 111 is nice'  | awk '
     /1 is/ {if (f) {print} else {f = 1;print "URK!!!"}}
    !/1 is/ {print}'

xyz
URK!!!
line 2 is ugly
myline 111 is nice

Чтобы использовать переменную оболочки в awk, вы можете использовать параметр -v, чтобы передать ее как реальную переменную awk:

pax$ export xyzvar=URK ; echo '
xyz
myline 1 is pretty
line 2 is ugly
myline 111 is nice'  | awk -vmyvar=$xyzvar '
     /1 is/ {if (f) {print} else {f = 1;print myvar}}
    !/1 is/ {print}'

xyz
URK
line 2 is ugly
myline 111 is nice
29.06.2011
  • отлично, это работает, но можете ли вы объяснить, как выполнить ту же команду, используя исходный текстовый файл, а не эхо и передачу в awk? обновление: я понял... имя файла awk 'instruction' 29.06.2011
  • можете ли вы объяснить вместо замены строки на URK!! я могу использовать переменную bash, чтобы заменить этот текст? я не могу использовать print $myvar внутри awk... :( 29.06.2011
  • @Fakada, вы используете -v для передачи переменных оболочки в виде переменных awk - смотрите обновление. 29.06.2011
  • Не уверен, почему ОП выбрал это в качестве решения. И почему это было даже предложено. Запрос был для sed, а не awk. Приведенное ниже решение для sed намного проще и дает желаемый результат гораздо короче. @paxdiablo упоминает об использовании awk для работы над более сложными задачами. Удалить первое вхождение регулярного выражения вряд ли сложно, и фактически в этом случае использование awk делает его таким. 07.03.2014
  • @theillien, это было предложено, потому что awk так же вездесущ, как sed, и потому что иногда пользователь не всегда знает, какие инструменты доступны или лучше всего подходят. Это подтверждается тем фактом, что ОП принял это, поскольку они бы этого не сделали, если бы это не решило проблему. Теперь может быть, что другой ответ лучше, и в прошлом я призывал к дополнительному просмотру, основанному исключительно на голосах (где принятый ответ не обязательно находится сверху), поскольку кажется логичным, что человек, задающий вопрос, не всегда иметь необходимые знания, чтобы выбрать лучший ответ. Но это было отклонено. 07.03.2014
  • Итак, что я обычно делаю, так это пропускаю принятые ответы на вопросы, которые я изучаю, и просто иду прямо к тем, кто получил наибольшее количество голосов, полагая, что рой ТАК лучше знает. Это может быть принятым ответом, а может и нет. 07.03.2014

  • 2

    Из sed часто задаваемых вопросов:

    sed '0,/RE/{//d;}' file        # delete only the first match
    sed '0,/RE/s//to_that/' file   # change only the first match
    

    Если вы не используете GNU sed, ознакомьтесь с альтернативами в FAQ.

    29.06.2011

    3

    Вы можете выполнить это без sed. Баш-скрипт:

    LINE=$(grep -n "$EXPR" "$FILE" |head -1 |cut -f1 -d:)
    head -$(expr $LINE - 1 ) $FILE
    tail +$(expr $LINE + 1 ) $FILE
    

    Просто объявите $EXPR и $FILE.

    29.06.2011
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..