Как программно редактировать файл, используя только терминал?


13

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

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

Ответы:


10

Вот где sedприходит играть. sedКоманда имеет следующий формат:

[pattern1][,pattern2][!] command [args]

Он использует регулярные выражения, поэтому это может быть / будет немного сложно. Некоторые основные примеры взяты из 2-й ссылки ниже:

# заменить (найти и заменить) «foo» на «bar» в каждой строке
sed 's / foo / bar /' # заменяет только 1-й экземпляр в строке
sed 's / foo / bar / 4' # заменяет только 4-й экземпляр в строке
sed 's / foo / bar / g' # заменяет ВСЕ экземпляры в строке
sed 's / \ (. * \) foo \ (. * foo \) / \ 1bar \ 2 /' # заменяет предпоследний регистр
sed 's / \ (. * \) foo / \ 1bar /' # заменяет только последний случай

# заменить "foo" на "bar" ТОЛЬКО для строк, содержащих "baz"
sed '/ baz / s / foo / bar / g'

# замените «foo» на «bar», КРОМЕ строк, содержащих «baz», КРОМЕ
sed '/ baz /! s / foo / bar / g'

# замените «алый», «рубиновый» или «puce» на «красный»
sed 's / scarlet / red / g; s / ruby ​​/ red / g; s / puce / red / g' # большинство seds
gsed 's / scarlet \ | ruby ​​\ | puce / red / g' # только GNU sed

Некоторые ссылки


7

Очень поздний ответ. Однако это может помочь другим с подобной проблемой / вопросом.

Я бы порекомендовал создать и применить патч. Хороший пример можно найти здесь .

Например, предположим, что файл new.txt содержит изменения, которые вы хотите применить к old.txt. Вы можете выполнять команды на терминале или путем создания и выполнения patch_file.sh.

Командная строка: откройте терминал, скопируйте и выполните следующие строки (при необходимости измените имена файлов):

diff old.txt new.txt > patch.patch # to create the patch
patch old.txt -i patch.patch -o patched_old.text # to apply patch

Сценарий: использование подхода .sh. В терминале (клавиатура: Ctrl + Alt + T: gedit patch_file.sh

Скопируйте и вставьте команды, которые будут идти на терминале, в файл .sh и под заголовком, как показано ниже (gedit).

#!/bin/sh
diff old.txt new.txt > patch.patch # to create the patch
patch old.txt -i patch.patch -o patched_old.text # to apply patch

Сделайте скрипт исполняемым (терминал):

chmod +x patch_file.sh

Запустите скрипт (терминал):

./patch_file.sh # may require sudo access depending on the directory affected

+1 патч всегда прямой путь для средних и тяжелых или сложных модификаций. Я не знаю, почему некоторые пытаются делать все, используя инструменты регулярных выражений.
user.dz

+1 намного лучше, чем обратное проектирование регулярного выражения, которое, кажется, применяет требуемое изменение к файлу, с которым вы тестируете ... но при применении к другим экземплярам этого файла иногда имеет другие эффекты.
bigjosh

Имеет ли смысл исправление, если я хочу заменить все экземпляры определенных текстовых строк, т.е. заменить все "" на "_", все "минус" на "-" и все "gb | <string_of_numbers> | ARO:" на " ARO: "? Благодарю.
Джош

1

Если вы хотите отредактировать файл, используйте редактор файлов, есть командные редакторы файлов, которые можно использовать из сценариев, например ex или ed .


1

Вы ищете sed или awk. Я считаю, что sed проще, а awk - мощнее.

Вот пример из другого вопроса .

sed -i 's/gedit.desktop/yournew.desktop/g' /usr/share/applications/defaults.list

Это означает:

  • поиск в файле /usr/share/applications/defaults.list
  • Найти / Grep gedit.desktop
  • Заменить yournew.desktop
  • Применить изменения на месте -i

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.