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

Недавно я столкнулся с той же проблемой при установке Ubuntu на компьютер друга. Кажется, что Ubiquity (установщик Ubuntu) для 10.10 не очень информативен, когда все идет не так. Ваше имя пользователя содержит заглавные буквы? Попробуйте убедиться, что все буквы в вашем имени пользователя являются строчными.

Для получения дополнительной информации см.: Как я могу найти ошибку об Ubiquity?

Соответствующие отчеты об ошибках:

Имя пользователя, начинающееся с верхней буквы, помеченной как OK во время установки и отказ от Ubiquity должен давать визуальную обратную связь, что имя пользователя не может содержать заглавные буквы (!)
1
задан 6 September 2014 в 01:24

5 ответов

Существует несколько способов сделать это. Один использует 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
25
ответ дан 25 May 2018 в 23:36
  • 1
    обратите внимание, что cat в cat file | sed '...' не требуется. Вы можете прямо сказать sed '...' file. – fedorqui 9 October 2015 в 14:54
  • 2
    В самом деле, это может быть еще более уменьшено: sed -i'.bak' -e 's/unicorn/fox/g;s/hyper/brown/g' yarly будет принимать файл yarly и сделать 2 изменения на месте при создании резервной копии. Используя time bash -c "$COMMAND" во времени, это говорит о том, что эта версия в 5 раз быстрее. – pbhj 22 October 2017 в 23:14

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

ex -sc '%s/OLD/NEW/g|x' file
% выбрать все строки s заменить g заменить все экземпляры в каждой строке x записать, если были сделаны изменения ( они имеют) и выходят
14
ответ дан 25 May 2018 в 23:36

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

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

Пример:

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

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

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

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

Пример: [ ! d6]

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

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

Через Perl,

$ echo 'foo' | perl -pe 's/foo/bar/g'
bar
13
ответ дан 25 May 2018 в 23:36

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

В этом ответе я использую простой файл 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 [!d5 ]

Боковое примечание: если вам интересно, почему используется 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 было бы легко: [ ! d11]

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("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(), которая может использоваться для более сложных замеров.

10
ответ дан 25 May 2018 в 23:36

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

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

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

. немногие, храбрые. Адд, храбрый.

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

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

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

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

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

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

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

-e указывает, что выражение / команда запускается в этом случае s/.

4
ответ дан 25 May 2018 в 23:36

Другие вопросы по тегам:

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