Как я могу найти и заменить определенные слова в текстовом файле, используя командную строку?
command-line
text-processing
Джон Доу
источник
источник
Ответы:
Объяснение:
sed
= Stream EDitor-i
= на месте (т.е. сохранить обратно в исходный файл)Командная строка:
s
= команда заменыoriginal
= регулярное выражение, описывающее слово для замены (или только само слово)new
= текст для заменыg
= глобальный (т.е. заменить все, а не только первое вхождение)file.txt
= имя файлаисточник
sed
будут соответствовать им. Добавьте-r
флаг, если вы хотите использовать вместо этого расширенные RE./
вам требуется сопоставить именно символ, вы можете просто использовать какой-то другой символ в качестве разделителя (например's_old/text_new/text_g'
). В противном случае вы можете поставить\
перед любым из них,$ * . [ \ ^
чтобы получить буквальный символ.sed -i '.bak' 's/original/new/g' file.txt
также можно запустить с расширением нулевой длиныsed -i '' 's/original/new/g' file.txt
, которое не будет создавать резервную копию.Есть несколько разных способов сделать это. Один использует
sed
и Regex. SED - это потоковый редактор для фильтрации и преобразования текста. Один пример выглядит следующим образом:Другой способ , который может иметь больше смысла , чем
< strin
и> strout
является с трубами!источник
cat
вcat file | sed '...'
этом нет необходимости. Вы можете прямо сказатьsed '...' file
.sed -i'.bak' -e 's/unicorn/fox/g;s/hyper/brown/g' yarly
будет принимать файл и делать 2 изменения на месте во время создания резервной копии. Использованиеtime bash -c "$COMMAND"
времени предполагает, что эта версия примерно в 5 раз быстрее.Есть множество способов достичь этого. В зависимости от сложности того, чего можно достичь с помощью замены строки, и в зависимости от инструментов, с которыми пользователь знаком, некоторые методы могут быть предпочтительнее других.
В этом ответе я использую простой
input.txt
файл, который вы можете использовать для проверки всех примеров, представленных здесь. Содержимое файла:BASH
Bash на самом деле не предназначен для обработки текста, но простые замены могут быть выполнены с помощью расширения параметров , в частности, здесь мы можем использовать простую структуру
${parameter/old_string/new_string}
.Этот небольшой скрипт не выполняет замену на месте, это означает, что вам придется сохранить новый текст в новый файл и избавиться от старого файла, или
mv new.txt old.txt
Примечание: если вам интересно, почему
while IFS= read -r ; do ... done < input.txt
он используется, то в основном это способ чтения файла строка за строкой. Смотрите это для справки.AWK
AWK, будучи утилитой обработки текста, вполне подходит для такой задачи. Он может делать простые замены и намного более сложные, основанные на регулярных выражениях . Он обеспечивает две функции:
sub()
иgsub()
. Первый из них заменяет только первое вхождение, а второй - заменяет вхождения во всей строке. Например, если у нас есть строкаone potato two potato
, это будет результат:AWK может принять входной файл в качестве аргумента, поэтому
input.txt
было бы легко сделать то же самое с :В зависимости от версии AWK, которая у вас есть, она может иметь или не иметь редактирование на месте, поэтому обычная практика - сохранять и заменять новый текст. Например что-то вроде этого:
SED
Sed - это редактор строк. Он также использует регулярные выражения, но для простых замен достаточно сделать:
Что хорошо в этом инструменте, так это то, что он имеет редактирование на месте, которое вы можете включить с
-i
флагом.Perl
Perl - это еще один инструмент, который часто используется для обработки текста, но это язык общего назначения, который используется в сетях, системном администрировании, настольных приложениях и во многих других местах. Он заимствовал много концепций / функций из других языков, таких как C, sed, awk и другие. Простую замену можно сделать так:
Как и у sed, у perl также есть флаг -i.
питон
Этот язык очень универсален и также используется в самых разных приложениях. Он имеет много функций для работы со строками, среди которых есть
replace()
, так что если у вас есть переменная, какvar="Hello World"
, вы могли бы сделатьvar.replace("Hello","Good Morning")
Простой способ прочитать файл и заменить строку в нем будет так:
Однако в Python вам также нужно выводить в новый файл, что вы также можете сделать из самого скрипта. Например, вот простой:
Этот скрипт должен вызываться
input.txt
как аргумент командной строки. Точная команда для запуска скрипта Python с аргументом командной строки будетили же
Конечно, убедитесь, что он
./myscript.py
находится в вашем текущем рабочем каталоге, и, во-первых, убедитесь, что он установлен как исполняемый сchmod +x ./myscript.py
Python также может иметь регулярные выражения, в частности, есть
re
модуль, который имеетre.sub()
функцию, которую можно использовать для более сложных замен.источник
tr
команды в Unixtr
еще один замечательный инструмент, но учтите, что он предназначен для замены наборов символов (например,tr abc cde
будет переводитьa
вc
,b
кd
. Это немного отличается от замены целых слов как наsed
илиpython
Вы можете использовать Vim в режиме Ex:
%
выбрать все строкиs
заменаg
заменить все экземпляры в каждой строкеx
написать, если изменения были внесены (есть) и выйтиисточник
Через команду gsub в awk,
Пример:
В приведенном выше примере все 1 заменяются на 0 независимо от столбца, в котором они расположены.
Если вы хотите сделать замену для определенного столбца, то сделайте так,
Пример:
Он заменяет 1 на 0 только в первом столбце.
Через Perl,
источник
inotifywait
подsh
окр, и представление данных в формате CSV (поскольку пользовательский формат глючит). Затем я подумал, что нет простого способа обработки CSV-документа в сценариях оболочки ... И я хочу, чтобы он был очень легким. Поэтому я запустил довольно простой скрипт для разбора и отчета о CSV. Я прочитал спецификацию CSV и заметил, что она более сложна, чем я ожидал, и поддерживаю многострочное значение, заключенное в двойные кавычки. Я полагался наsed
токенизацию, но вскоре понял, что даже то, чтоsed
называется мультилиней, состоит из двух строк. Что тогда, если одно из моих значений CSV занимает более двух строк?sed
является s Tream ред itor , в том , что вы можете использовать|
(трубы) для передачи стандартных потоков (STDIN и STDOUT в частности) путемsed
и изменять их программно на лету, что делает его удобным инструментом в философии традиции Unix; но также можете редактировать файлы напрямую, используя-i
параметр, указанный ниже.Учтите следующее :
s/
используется для S ubstitute найденное выражениеfew
сasd
:/g
расшифровывается как «глобальный», что означает сделать это для всей строки. Если вы пропустите/g
(сs/few/asd/
, всегда должно быть три слэша, несмотря ни на что) иfew
появятся дважды в одной строке, только первыйfew
изменится наasd
:Это полезно в некоторых обстоятельствах, таких как изменение специальных символов в начале строк (например, замена символов «больше», которые некоторые люди используют для цитирования предыдущего материала в темах электронной почты, на горизонтальной табуляции, оставляя после этого цитируемое алгебраическое неравенство позже в строке нетронутый), но в вашем примере, где вы указываете, что где-либо
few
происходит, его следует заменить, убедитесь, что у вас есть/g
.Следующие два параметра (флаги) объединены в один
-ie
:-i
Опция используется для редактирования я п установить на файлhello.txt
.-e
Опция указывает на электронную XPression / команду для запуска, в данном случаеs/
.Примечание. Важно использовать его
-i -e
для поиска / замены. Если вы это сделаете-ie
, вы создадите резервную копию каждого файла с добавленной буквой «е».источник
Вы можете сделать так:
Примеры: чтобы заменить все вхождения [logdir ',' '] (без []) на [logdir', os.getcwd ()] во всех файлах, которые являются результатом команды locate, выполните:
EX1:
ех2:
где [tenorboard / program.py] - файл для поиска
источник
logdir', ''
->/logdir', os.getcwd()
) затрудняет анализ этого ответа. Кроме того, стоит указать, что ваш ответ сначала находит файлы для использования sed, потому что это не является частью вопроса.