Найти и заменить внутри текстового файла с помощью команды Bash - PullRequest
481 голосов
/ 08 февраля 2009

Какой самый простой способ найти и заменить данную входную строку, скажем, abc, и заменить другой строкой, скажем, XYZ в файле /tmp/file.txt?

Я пишу приложение и использую IronPython для выполнения команд через SSH & mdash; но я не очень хорошо знаю Unix и не знаю, что искать.

Я слышал, что Bash, помимо интерфейса командной строки, может быть очень мощным языком сценариев. Итак, если это правда, я предполагаю, что вы можете выполнять такие действия.

Могу ли я сделать это с помощью bash, и какой самый простой (однострочный) скрипт для достижения моей цели?

Ответы [ 14 ]

5 голосов
/ 01 июня 2016

Попробуйте следующую команду оболочки:

find ./  -type f -name "file*.txt" | xargs sed -i -e 's/abc/xyz/g'
4 голосов
/ 11 мая 2015

Чтобы редактировать текст в файле неинтерактивно, вам необходим текстовый редактор на месте, например vim.

Вот простой пример того, как использовать его из командной строки:

vim -esnc '%s/foo/bar/g|:wq' file.txt

Это эквивалентно @ тонкий ответ из ex редактор, который в основном то же самое.

Вот несколько ex практических примеров.

Замена текста foo на bar в файле:

ex -s +%s/foo/bar/ge -cwq file.txt

Удаление конечных пробелов для нескольких файлов:

ex +'bufdo!%s/\s\+$//e' -cxa *.txt

Устранение неисправностей (когда терминал застрял):

  • Добавить -V1 param для отображения подробных сообщений.
  • Принудительное завершение по: -cwq!.

Смотри также:

2 голосов
/ 03 мая 2016

Вы также можете использовать python в скрипте bash. У меня не было большого успеха с некоторыми из лучших ответов здесь, и я нашел, что это работает без необходимости циклов:

#!/bin/bash
python
filetosearch = '/home/ubuntu/ip_table.txt'
texttoreplace = 'tcp443'
texttoinsert = 'udp1194'

s = open(filetosearch).read()
s = s.replace(texttoreplace, texttoinsert)
f = open(filetosearch, 'w')
f.write(s)
f.close()
quit()
1 голос
/ 12 февраля 2015

Вы можете использовать команду rpl. Например, вы хотите изменить имя домена во всем проекте php.

rpl -ivRpd -x'.php' 'old.domain.name' 'new.domain.name' ./path_to_your_project_folder/  

Это не совсем понятно, но это очень быстро и полезно. :)

...