Неверная геометрия диска на USB-корпусе

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

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

1
задан 4 November 2013 в 19:13

0 ответов

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

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