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

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

417 голосов | спросил Jon Doe 7 Jam1000000amFri, 07 Jan 2011 07:10:13 +030011 2011, 07:10:13

7 ответов


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

Пояснение:

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

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

ответил cscarney 7 Jam1000000amFri, 07 Jan 2011 07:23:29 +030011 2011, 07:23:29
26

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

marco @ imacs-suck: ~ $ echo "Медленный коричневый единорог перепрыгнул через гипер спящую собаку"> орел
marco @ imacs-suck: ~ $ sed s /slow /quick /<orly> ярлы
marco @ imacs-suck: ~ $ cat yarly
Быстро коричневый единорог перепрыгнул через гипер спящую собаку

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

marco @ imacs-suck: ~ $ cat yarly | sed s /единорог /лиса /| sed s /hyper /lazy /> nowai
marco @ imacs-suck: ~ $ cat nowai
Быстрая коричневая лиса перепрыгнула через ленивую спящую собаку
ответил Marco Ceppi 7 Jam1000000amFri, 07 Jan 2011 07:26:26 +030011 2011, 07:26:26
15

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

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

  2. s заменить

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

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

ответил Steven Penny 16 PMpSat, 16 Apr 2016 21:36:05 +030036Saturday 2016, 21:36:05
13

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

awk '{gsub (/pattern /, "replacement")}' файл

Пример:

awk '{gsub (/1 /, "0");}' файл

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


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

awk '{gsub (/pattern /, "replacement", column_number)}' файл

Пример:

awk '{gsub (/1 /, "0", $ 1);}' файл

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

Через Perl,

$ echo 'foo' | perl -pe 's /foo /bar /g'
бар
ответил Avinash Raj 2 J000000Wednesday14 2014, 16:59:12
11

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

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

розы красные, фиалки голубые
Это input.txt, и это не рифмовать

BASH

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

#! /Bin /Баш
в то время как IFS = read -r line
делать
    case "$ line" в
       * blue *) printf "% s \ n" "$ {line /blue /azure}" ;;
       *) printf "% s \ n" "$ line" ;;
    ESAC
done <input.txt

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

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

AWK

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

$ echo "один картофель с двумя картофелями" | awk '{gsub (/potato /, "banana")} 1'
один банан два банана

$ echo «один картофель с двумя картофелями» | awk '{sub (/potato /, "banana")} 1'
один банан два картофеля

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 - редактор строк. Он также использует регулярные выражения, но для простых подстановок достаточно:

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

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

Perl

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

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

Подобно sed, perl также имеет флаг -i.

Python

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

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

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 ()

с open (sys.argv [1]) как fd1, open (tmp [1], 'w') как fd2:
    для строки в fd1:
        line = line.replace ('blue', 'azure')
        fd2.write (линия)

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

Этот скрипт вызывается с input.txt как аргумент командной строки.

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

ответил Sergiy Kolodyazhnyy 3 FebruaryEurope/MoscowbFri, 03 Feb 2017 10:49:23 +0300000000amFri, 03 Feb 2017 10:49:23 +030017 2017, 10:49:23
5

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

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

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

  

Немного, смелые.

     

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

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

  

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

     

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

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

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

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

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

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

ответил Chaminda Bandara 23 42017vEurope/Moscow11bEurope/MoscowThu, 23 Nov 2017 12:00:29 +0300 2017, 12:00:29
0

Вы можете сделать следующее:

найдите <часть имени файла, чтобы найти> | xargs sed -i -e "s /<Старый текст>, <новый текст> /g"

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

найти тензор /program.py | xargs sed -i -e "s /logdir ',' '/logdir', os.getcwd () /g"

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

ответил Nguyễn Tuấn Anh 24 J000000Tuesday18 2018, 05:13:54

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132