2

У меня есть папка .txt файлов. Все они выглядят так:

Title: Title of blog post.
Tags: tag1,tag2,tag3

Text on the post. Just my thoughts. 

> A blockqoute

Written in *markdown.* Using <http://scriptogr.am/>

Nothing really scary.

Допустим, по какой-то причине я хочу изменить имя tag1 на tagOne . Можно ли запустить какой-нибудь grep или найти и заменить эти txt внутри моей папки?

Бонус, если я могу выполнить поиск и заменить только первые 1-3 строки, так как я могу написать слово "tag1" в теле моего сообщения в блоге, но не хочу менять его там.

Я на Windows 7. Но имейте доступ к машине Kubuntu (если это будет иметь какое-либо значение).

3 ответа3

3

Самый простой способ сделать это - на вашем компьютере с GNU/Linux использовать sed(1). Предполагая, что в каталоге находятся только текстовые файлы, которые вы хотите преобразовать:

$ for a in /path/to/directory/*txt; do sed -i '1,3{s/tag1/tagOne/g;}' "${a}"; done

Что это делает, объяснили более подробно:

  • Существует цикл для перебора файлов, с которыми вы хотите работать:

    for a in [...]; do [...]; done
    
  • Для каждой итерации переменная a будет содержать имя файла, совпадающего с шаблоном globbing /path/to/directory/*txt .

  • Как только мы узнаем, с каким файлом мы работаем, давайте do то с ним сделаем , в данном случае, командой sed:

    sed -i '1,3{s/tag1/tagOne/g;}'
    
  • Флаг -i означает « in place , поэтому команде sed не нужно записывать временные файлы. Далее, 1,3 определяет диапазон строк, на которых будет работать команда sed . Фигурные скобки являются оператором группировки, что означает «от строки 1 до 3 выполнить внутреннюю команду». Эта команда s: заменить. Команда replace принимает регулярное выражение для сопоставления и строку для замены этого совпадения, в этом случае вы хотите заменить tag1 на tagOne . Команда заканчивается модификатором g , что означает global .

На простом английском языке вся команда гласит:

Для каждого файла в указанном каталоге, имя которого заканчивается на txt, замените в нем, но только в строках от одной до трех, все вхождения tag1 на tagOne.

1

Вы можете использовать Vim в режиме Ex:

for k in *.txt
do
  ex -sc '1s/tag1/tagOne/3|x' "$k"
done
  1. 1 переход на первую строку

  2. 3 выберите 3 строки

  3. s заменой

  4. x сохранить и закрыть

0

Это можно сделать в блокноте ++, когда вы нажмете

ctrl+shift+F

Команда называется Найти в файлах.

Это не выполнить "первые три линии". Обходной путь для этого может заключаться в названии моих тегов @ tag1 или # tag1 или & tag1 для начала.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .