Як програматично редагувати файл за допомогою лише терміналу?


13

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

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

Відповіді:


10

Ось де sedвступає грати. sedКоманда має такий вигляд:

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

Він використовує регулярні вирази, тому це може / буде трохи важко. Деякі основні приклади, взяті з 2-го посилання нижче:

# замінити (знайти та замінити) "foo" на "bar" у кожному рядку
sed 's / foo / bar /' # замінює лише перший екземпляр у рядку
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'

# змінити "червоний" або "рубін" або "пуче" на "червоний"
sed 's / scarlet / red / g; s / ruby ​​/ red / g; s / puce / red / g' # most seds
gsed 's / scarlet \ | ruby ​​\ | puce / red / g' # GNU sed only

Деякі посилання


7

Дуже пізня відповідь. Однак це може допомогти іншим у подібній проблемі / питанні.

Я рекомендую створити та застосувати патч. Гарний приклад можна знайти тут .

Наприклад, якщо припустити, що новий файл.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
  • Знайти / греп gedit.desktop
  • Замінити yournew.desktop
  • Застосовуйте зміни на місці -i

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.