WedX - журнал о программировании и компьютерных науках

Как добавить # перед любой строкой, содержащей соответствующий шаблон в BASH?

Мне нужно добавить # перед любой строкой, содержащей шаблон «000», например, рассмотрим этот образец файла:

This is a 000 line.
This is 000 yet ano000ther line.
This is still yet another line.

Если я запускаю команду, она должна добавить # в начало всех файлов, где было найдено «000». Результат будет таким:

#This is a 000 line.
#This is 000 yet ano000ther line.
This is still yet another line.

Лучшее, что я могу сделать, это цикл while, подобный этому, который кажется слишком сложным:

while read -r line
do
    if [[ $line == *000* ]]
    then
          echo "#"$line >> output.txt
    else
          echo $line >> output.txt
    fi
done < file.txt

Как я могу добавить # перед любой строкой, где найден шаблон?

15.06.2014

  • Для этого вы можете использовать команду sed, но не думали ли вы сделать это с помощью текстового редактора? Например, в vim эту задачу можно легко автоматизировать с помощью макросов. 15.06.2014

Ответы:


1

Это может сработать для вас (GNU sed):

sed 's/.*000/#&/' file
15.06.2014
  • Village спасибо, но я думаю, что ответ Тима Купера, вероятно, является лучшим решением с использованием sed. При использовании sed обычно считается, что поиск с последующей заменой более эффективен, чем единственная команда подстановки (однако я думаю, что одиночное цитирование команды sed в командной строке, как правило, безопаснее, особенно когда эта команда может быть улучшена в будущем) . 16.06.2014
  • Если я хочу добавить # после 9 строк и ниже 2 строк соответствующего шаблона. Я пробовал ниже две команды sed, но не работает, не могли бы вы помочь. sed /create_rev -name FLK/-2,+9s/^/# и sed '/create_rev -name ALK/-2,+9s/^/#' 01.07.2021
  • @Rama, почему бы не попросить решение в виде нового вопроса? 01.07.2021
  • обязательно задам новый вопрос. 01.07.2021

  • 2

    Для вас будет работать следующая команда sed, которая не требует никаких групп захвата:

    sed /000/s/^/#/
    

    Объяснение:

    • /000/ соответствует строке с 000
    • s выполнить замену в строках, совпадающих выше
    • Подстановка вставит символ решетки (#) в начале строки (^).
    15.06.2014
  • Это не нуждается в кавычках? Я никогда не видел скрипт sed без них. 15.06.2014
  • @Village: Поскольку нет специальных символов, которые bash пытается интерпретировать (# не вызывает никаких проблем, поскольку является частью более крупного слова), кавычки не нужны. 15.06.2014
  • @TimCooper Спасибо за помощь, мне нужно что-то для файла конфигурации MYSQL, и это сработало для меня sed -i '/bind-address/s/^/#/' /etc/mysql/mysql.conf.d/mysqld.cnf 28.09.2018
  • @TimCooper, если я хочу добавить # после 9 строк и ниже 2 строк соответствующего шаблона. Я пробовал код ниже, но не работает, не могли бы вы помочь. sed /create_rev -name FLK/-2,+9s/^/# и sed '/create_rev -name ALK/-2,+9s/^/#' 01.07.2021

  • 3

    вопрос заключался в том, как добавить знак фунта к этим строкам в файле, чтобы сделать превосходный ответ Тима Купера более полным, я бы предложил следующее:

    sed /000/s/^/#/ > output.txt
    

    или вы можете рассмотреть возможность использования возможности sed для редактирования рассматриваемого файла на месте, а также для создания резервной копии, например:

    sed -i.bak /000/s/^/#/ file.txt
    

    опция "-i" отредактирует и сохранит файл встроенный/на месте, опция "-i.bak" также создаст резервную копию исходного файла в file.txt.bak на случай, если вы что-то испортите.

    вы можете заменить «.bak» любым суффиксом по своему вкусу. например: "-i.orignal" создаст исходный файл как: "file.txt.orignal"

    23.05.2018

    4

    или используйте ed:

    echo -e "g/000/ s/^/#/\nw\nq" | ed -s FILENAME
    

    или открыть файл в ed:

    ed FILENAME
    

    и напишите эту команду

    g/000/ s/^/#/
    w
    q
    
    15.06.2014
  • Что ж, да, это работает, но мне кажется бессмысленным вручную вводить или передавать данные в интерактивную программу, такую ​​​​как ed, когда для этого существуют специальные неинтерактивные инструменты, такие как sed. Кроме того, например, sed был установлен по умолчанию в моей системе Debian, а ed — нет. И версия sed имеет гораздо меньше наворотов в командной строке. 16.02.2017

  • 5

    Попробуйте эту команду GNU sed,

    $ sed -r '/000/ s/^(.*)$/#\1/g' file
    #This is a 000 line.
    #This is 000 yet ano000ther line.
    This is still yet another line.
    

    Пояснение:

    • Замена /000/ sed работает только в строке, которая содержит 000. Как только он находит соответствующую строку, он добавляет перед ней символ #.

    И через авк,

    $ awk '/000/{gsub (/^/,"#")}1' file
    #This is a 000 line.
    #This is 000 yet ano000ther line.
    This is still yet another line
    
    • Функция gsub используется для добавления # перед строками, содержащими 000.
    15.06.2014
  • Я не был против, но нет причин захватывать (.*) только для того, чтобы заменить его самим собой \1 -- s/^/#/ намного проще 15.06.2014
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]