Вопрос Найти и заменить текст в файле с помощью команд


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


437
2018-01-07 04:10


происхождения


Май вашего интереса github.com/lucio-martinez/rch :-) - Lucio


ответы:


sed -i 's/original/new/g' file.txt

Объяснение:

  • sed = Редактор потока
  • -i = на месте (т. е. сохранить обратно в исходный файл)
  • Командная строка:

    • s = команда подстановки
    • original = регулярное выражение, описывающее заменяемое слово (или просто само слово)
    • new = текст, чтобы заменить его
    • g = global (т. е. заменить все, а не только первое вхождение)
  • file.txt = имя файла


728
2018-01-07 04:23



@mcExchange Если это специально / который вам нужно сопоставить, вы можете просто использовать какой-либо другой символ в качестве разделителя (например, 's_old/text_new/text_g'). В противном случае вы можете \  перед любым из $ * . [ \ ^ чтобы получить буквальный характер. - cscarney
@BrianZ Что касается файловой системы, то вывод sed - это новый файл с тем же именем. Это один из часто сообщаемые ошибки, которые не являются ошибками - cscarney
Вы можете захотеть s/\boriginal\b/new/g вместо s/original/new/g (\b соответствует границе слова), чтобы заменить только целые слова. - Chris Martin
Команда OSX sed -i '.bak' 's/original/new/g' file.txt может также выполняться с расширением нулевой длины sed -i '' 's/original/new/g' file.txt, который не будет создавать резервные копии. - Kirk
Пользователям MacOS придется добавить '' "после -i в качестве параметра для -i ed.gs/2016/01/26/os-x-sed-invalid-command-code так что файл будет перезаписан. - geoyws


Существует несколько способов сделать это. Один использует sed и Regex. SED - редактор потоков для фильтрации и преобразования текста. Один из примеров:

marco@imacs-suck: ~$ echo "The slow brown unicorn jumped over the hyper sleeping dog" > orly
marco@imacs-suck: ~$ sed s/slow/quick/ < orly > yarly
marco@imacs-suck: ~$ cat yarly
The quick brown unicorn jumped over the hyper sleeping dog

Другой способ, который может иметь больше смысла, чем < strin а также > strout с трубками!

marco@imacs-suck: ~$ cat yarly | sed s/unicorn/fox/ | sed s/hyper/lazy/ > nowai
marco@imacs-suck: ~$ cat nowai 
The quick brown fox jumped over the lazy sleeping dog

26
2018-01-07 04:26



Обратите внимание cat в cat file | sed '...' не требуется. Вы можете прямо сказать sed '...' file, - fedorqui
Действительно, это может быть еще более сокращено: sed -i'.bak' -e 's/unicorn/fox/g;s/hyper/brown/g' yarly будет принимать файл yarly и выполнять 2 изменения на месте при создании резервной копии. С помощью time bash -c "$COMMAND" до времени он предполагает, что эта версия в 5 раз быстрее. - pbhj


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

ex -sc '%s/OLD/NEW/g|x' file
  1. % выберите все строки

  2. s замена

  3. g заменить все экземпляры в каждой строке

  4. x напишите, если изменения были сделаны (они есть) и выйдите


15
2018-04-16 18:36





Через команду gsub awk,

awk '{gsub(/pattern/,"replacement")}' file

Пример:

awk '{gsub(/1/,"0");}' file

В приведенном выше примере все 1 заменены на 0, независимо от того, где находится столбец.


Если вы хотите сделать замену в определенном столбце, тогда сделайте это,

awk '{gsub(/pattern/,"replacement",column_number)}' file

Пример:

awk '{gsub(/1/,"0",$1);}' file

Он заменяет 1 на 0 только на столбец 1.

Через Perl,

$ echo 'foo' | perl -pe 's/foo/bar/g'
bar

14
2017-07-02 12:59



Я использовал это на терминале MacOS, и он ничего не сделал ... - Jim


Существует множество способов его достижения. В зависимости от сложности того, что вы пытаетесь достичь с заменой строки, и в зависимости от инструментов, с которыми пользователь знаком, некоторые методы могут быть предпочтительнее других.

В этом ответе я использую простые input.txt файл, который вы можете использовать для тестирования всех приведенных здесь примеров. Содержимое файла:

roses are red , violets are blue
This is an input.txt and this doesn't rhyme

BASH

Bash не предназначен для обработки текста, но простые замены могут быть выполнены посредством расширение параметра , в частности, здесь мы можем использовать простую структуру ${parameter/old_string/new_string},

#!/bin/bash
while IFS= read -r line
do
    case "$line" in
       *blue*) printf "%s\n" "${line/blue/azure}" ;;
       *) printf "%s\n" "$line" ;;
    esac
done < input.txt

Этот небольшой скрипт не выполняет замену на месте, что означает, что вам нужно будет сохранить новый текст в новый файл и избавиться от старого файла или mv new.txt old.txt

Замечание: если вам интересно, почему while IFS= read -r ; do ... done < input.txt используется, это в основном способ чтения файлов по строкам. Видеть это для справки.

AWK

AWK, являясь утилитой для обработки текста, вполне подходит для такой задачи. Он может выполнять простые замены и гораздо более продвинутые, основанные на обычные выражения, Он обеспечивает две функции: sub() а также gsub(), Первый заменяет только первое вхождение, а второе - заменяет вхождения в целую строку. Например, если у нас есть строка one potato two potato , это будет результат:

$ echo "one potato two potato" | awk '{gsub(/potato/,"banana")}1'
one banana two banana

$ echo "one potato two potato" | awk '{sub(/potato/,"banana")}1'                                      
one banana two potato 

AWK может принимать входной файл в качестве аргумента, поэтому делать то же самое с помощью input.txt , было бы легко:

awk '{sub(/blue/,"azure")}1' input.txt

В зависимости от версии AWK у вас есть, возможно, нет или нет редактирования на месте, поэтому обычная практика заключается в сохранении и замене нового текста. Например, что-то вроде этого:

awk '{sub(/blue/,"azure")}1' input.txt > temp.txt && mv temp.txt input.txt

SED

Сед - редактор строк. Он также использует регулярные выражения, но для простых подстановок достаточно:

sed 's/blue/azure/' input.txt

Что хорошего в этом инструменте, так это то, что у него есть редактирование на месте, с которым вы можете включить -i флаг.

Perl

Perl - еще один инструмент, который часто используется для обработки текста, но это язык общего назначения и используется в сетях, системном администрировании, настольных приложениях и многих других местах. Он заимствовал множество концепций / функций с других языков, таких как C, sed, awk и других. Простую замену можно сделать так:

perl -pe 's/blue/azure/' input.txt

Как и у sed, perl также имеет флаг -i.

питон

Этот язык очень универсален и также используется в самых разных приложениях. Он имеет множество функций для работы со строками, среди которых replace(), поэтому, если у вас есть переменная типа var="Hello World" , вы могли бы сделать var.replace("Hello","Good Morning")

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

python -c "import sys;lines=sys.stdin.read();print lines.replace('blue','azure')" < input.txt

Однако с Python вам также нужно выводить на новый файл, который вы также можете сделать из самого скрипта. Например, вот простой:

#!/usr/bin/env python
import sys
import os
import tempfile

tmp=tempfile.mkstemp()

with open(sys.argv[1]) as fd1, open(tmp[1],'w') as fd2:
    for line in fd1:
        line = line.replace('blue','azure')
        fd2.write(line)

os.rename(tmp[1],sys.argv[1])

Этот сценарий должен быть вызван input.txt как аргумент командной строки.

Python также может иметь регулярные выражения, в частности, есть re модуль, который имеет re.sub() функция, которая может использоваться для более сложных замен.


12
2018-02-03 07:49





sed это sTream изданиеitor, в котором вы можете использовать | (труба) для отправки стандартные потоки (STDIN и STDOUT) через sed и изменять их программно «на лету», что делает его удобным инструментом в философии философии Unix; но также может редактировать файлы напрямую, используя -i параметр, упомянутый ниже.
Рассмотрим следующее:

sed -i -e 's/few/asd/g' hello.txt

s/ используется для sучесть найденное выражение few с asd:

Немного, храбрые.


Адд, храбрый.

/g означает «глобальный», что означает сделать это для всей линии. Если вы оставите /g (с s/few/asd/, всегда должно быть три косынки, независимо от того, что) и few появляется дважды в одной строке, только первая few изменен на asd:

Немногие мужчины, немногие женщины, храбрые.


Мужчины-ас, немногие женщины, храбрые.

Это полезно в некоторых случаях, например, для изменения специальных символов в начале строк (например, для замены символов большего, чем некоторые люди используют для цитирования предыдущего материала в потоках электронной почты с горизонтальной вкладкой, оставляя при этом цитированное алгебраическое неравенство позже в строке нетронутый), но в вашем примере, где вы указываете, что в любом месте  few он должен быть заменен, убедитесь, что у вас это /g,

Следующие два параметра (флаги) объединяются в один, -ie:

-i опция используется для редактирования яn место в файле hello.txt,

-e указывает, что еxpression / command для запуска, в этом случае s/,

Примечание. Важно, чтобы вы использовали -i -e для поиска / замены. Если вы это сделаете -ie, вы создаете резервную копию каждого файла с добавлением буквы «e».


6
2017-11-23 09:00





Вы можете сделать так:

locate <part of filaname to locate> | xargs sed -i -e "s/<Old text>/<new text>/g" 

Примеры: для замены всех вхождений [logdir ',' '] (без []) с [logdir', os.getcwd ()] во всех файлах, являющихся результатом команды locate, выполните:

locate tensorboard/program.py | xargs sed -i -e "s/logdir', ''/logdir', os.getcwd()/g"

где [tensorboard / program.py] - файл для поиска


0
2017-07-24 02:13



Здравствуй. Ваш выбор строк (logdir', '' -> /logdir', os.getcwd()) делает этот ответ трудным для синтаксического анализа. Кроме того, стоит указать, что ваш ответ сначала находит файлы для использования sed, потому что это не вопрос. - mwfearnley
Привет, этот ответ - и поиск и замена всех, если он нашел <старый текст> в файле. - Nguyễn Tuấn Anh
Я выбираю этот ответ для всех, в которых они используют тензограмму в keras, которые хотят изменить команду: tensorboard --logdir = '/ path / to / log / folder /' для использования: только тензограмма, находясь в папке журналов. это очень удобно - Nguyễn Tuấn Anh