Я хотел бы написать сценарий оболочки, с помощью которого я мог бы читать файл из команды и редактировать файл без ручного вмешательства (на основе поиска одного текста и замены его другим).
Мне не нужно использовать какой-либо текстовый редактор для этого .... просто текстовый поиск (например, используя grep), а затем заменить его другим текстом и сохранить изменения ....
Вот где вступает в игру sed
. Команда sed
имеет следующий формат:
[pattern1][,pattern2][!] command [args]
Она использует регулярные выражения, поэтому это может / будет немного сложно. Некоторые базовые примеры взяты из 2-й ссылки ниже:
# substitute (find and replace) "foo" with "bar" on each line sed 's/foo/bar/' # replaces only 1st instance in a line sed 's/foo/bar/4' # replaces only 4th instance in a line sed 's/foo/bar/g' # replaces ALL instances in a line sed 's/\(.*\)foo\(.*foo\)/\1bar\2/' # replace the next-to-last case sed 's/\(.*\)foo/\1bar/' # replace only the last case # substitute "foo" with "bar" ONLY for lines which contain "baz" sed '/baz/s/foo/bar/g' # substitute "foo" with "bar" EXCEPT for lines which contain "baz" sed '/baz/!s/foo/bar/g' # change "scarlet" or "ruby" or "puce" to "red" 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
Некоторые ссылки
В зависимости от того, что вам нужно отредактировать, если вы знакомы с vi
, то ed
может оказаться полезным.
Очень поздний ответ. Однако это может помочь другим решить аналогичную проблему / вопрос.
Я бы рекомендовал создать и применить патч. Можно найти хороший пример здесь .
Например, предположим, что файл 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
Вы ищете 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
Если вы хотите отредактировать файл, используйте редактор файлов. Существуют редакторы файлов на основе команд, которые можно использовать из сценариев, например ex или ed .