LINUX.ORG.RU

bash - работа с текстом.

 


1

3

Доброго времени. Есть две переменных, первая содержит весь алфавит, а вторая 26 заранее сгенерированных строк типа:

+er+
+8i+
+3c+
...
Есть файл в котором нужно произвести замену всех «a» на «+er+», всех «b» на «+8i+» и т.д.

Как это можно сделать? Заранее спасибо



Последнее исправление: Sherman (всего исправлений: 1)

Ответ на: комментарий от Sherman

Я хз тогда

Погугли или жди пока придут умные дяди

Deleted
()
Ответ на: комментарий от Sherman
source = ['a', 'b', 'c', ' ']
dest = ['+er+', '+8i+', '+3c+', ' ']
dictionary = dict(zip(source, dest))
result = ''
string = 'abc abc abc'
for l in string:
    result += dictionary[l]

>>> +er++8i++3c+ +er++8i++3c+ +er++8i++3c+

python

conformist ★★★
()

На Python проще будет:

a = ['a', 'b', 'c']  # алфавит твой
b = ['+er+', '+8i+', '+3c+']  # список строк
f = "abccba"  # файл
result =  "".join(dict(zip(a, b))[i] for i in f)
assert result == '+er++8i++3c++3c++8i++er+'

Psych218 ★★★★★
()
Последнее исправление: Psych218 (всего исправлений: 1)
alphabet=$(echo {a..z} | tr -d ' ')
while read to
do
    sed -i s/${alphabet:0:1}/$to/g file/for/replace
    alphabet=${alphabet:1}
done < file/with/patterns


Это bash и немножко sed.

echo {a..z} | tr -d ' ' создаст алфавит и удалит разделяющие его пробелы.

Цикл читает файл с паттернами построчно в переменную to, седом заменяет по букве на текущий паттерн. ${var:offset:length} — взятие подстроки переменной var.

evilface ★★
()
Последнее исправление: evilface (всего исправлений: 3)

Как это можно сделать?

Вот ровно так, как вы описали. Берете и меняете все «a» на «+er+», все «b» на «+8i+» и т. д.

#!/bin/bash

file="$1"

[[ -f "$file" ]] || exit 1

alphabet=( a b c )
plus_encoding=(+er+ +8i+ +3c+)

declare -A dict
for ((i = 0; i <= ${#alphabet}; i++)); do
    dict[${alphabet[$i]}]="${plus_encoding[$i]}"
done

while read -r -N 1; do
    enc="${dict[$REPLY]}"
    if [[ $enc ]]; then
        buffer+="$enc"
    else
        buffer+="$REPLY"
    fi
done < "$file"

printf '%s' "$buffer" > "$file"
Zmicier ★★★★★
()

see to http://www.grymoire.com/Unix/Sed.html

переменные как заданы?

если охота что бы трансляция была седом то нуна генерировать код-траслятора сед-генаратором который под каждый вход-букву сделает замену

и ключик запуска в что бы сед считал каждый входной символ за полную строку - ну и дефалт-ветку по которой все не алфавитные выдавал без изменений.

короче sedом делать твой проблема есть игра ума и здоровый зарядка

anonymous
()

Используй язык программирования вместо bash

annulen ★★★★★
()
Ответ на: комментарий от Zmicier

1. Вместо супер-пупер башизма buffer+=«$enc» и потом вызова printf лучше просто echo -n «$enc».

2. И, кстати, при a=$b кавычки у «$b» совершенно не нужны, если нет дополнительных склеек с другими переменными/строками.

vodz ★★★★★
()
Ответ на: комментарий от Sherman

while read to; do
sed -i s/${alphabet:0:1}/$to/g file/for/replace

Спасибо! То что нужно.

ОМГ! Вот вы видите, товарищ evilface, насколько аккуратно что-то обнародовать в Сети — вы написали на скорую руку лютый индусский код, а человек не только всерьез это использовать станет (что еще ладно), он же это еще и за образец возьмет, когда сам что-нибудь писать будет.

Zmicier ★★★★★
()
Ответ на: комментарий от Deleted

Если это ГНУ Сед, то, если мне не изменяет память, с файлами он здесь «работает» так: удаляет и переименовывает. Это явно не то, что имел в виду ОП, и не то, что называется работой с файлом применительно к текстовому редактору.

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

А самое смешное, что все умники, советующие sed, приводят попросту некорректные решения: вот в предыдущем примере что будет, если «a» нужно менять не на «+er+», а на «+bc+» ?
И остальные не лучше.

ABW ★★★★★
()
Ответ на: комментарий от Zmicier

Конкретно сейчас не могу привести. Спать хочу дико. Но если уж очень хочется - Гугл в помощь.

mr_Heisenberg
()
ruby -pe '
    BEGIN {
        REP = Hash[("a".."z").to_a.zip(open("/t/list").lines.map(&:chomp))]
    }
    $_.gsub!(/[[:lower:]]/) {|x| REP[x]}
'
anonymous
()
Ответ на: комментарий от kostik87

справедливости ради, это нестандарт, вот в относительно нормальном sbase/sed такой опции нема

anonymous
()
Ответ на: комментарий от anonymous

Про какой стандарт ты говоришь? Что такое нормальный sed?

Скачай исходники sed: ftp://ftp.gnu.org/gnu/sed/ собери и посмотри что там есть эта опция.

Я использую Linux с 2006 года, начинал я с Debian, сейчас уже лет 7 - Gentoo, с самого начала параметр '-i' у sed был.

kostik87 ★★★★★
()
Ответ на: комментарий от kostik87

Про какой стандарт ты говоришь?

Есть cтандарт poxis. http://www.unix.com/man-page/posix/1p/sed/

Я использую Linux с 2006 года, начинал я с Debian, сейчас уже лет 7 - Gentoo, с самого начала параметр '-i' у sed был.

В 1998 - не было. Но это не важно. В BSD sed опция -i отличается от GNU sed, в BSD скорее -I равно -i.

vodz ★★★★★
()
Ответ на: комментарий от vodz

Спасибо за уточнение и про posix я знаю, но что имел в виду анонимус не известно.

Повторюсь, в gnu sed сейчас и уже довольно давно поддержка внесения изменений в файл без cat есть.

kostik87 ★★★★★
()
Ответ на: комментарий от Zmicier

Ну ок, хотя если у нас не гнутый sed, то и bash, скорее всего, не умеющий словари.

To ABW. Да, ты прав, я просто привел как пример, что sed умеет работать с файлами.

Deleted
()

примечательно, что ребята с python ошибок не допустили и выдали более-менее похожие решения

anonymous
()
Ответ на: комментарий от Zmicier

ОМГ! Вот вы видите, товарищ evilface, насколько аккуратно что-то обнародовать в Сети — вы написали на скорую руку лютый индусский код, а человек не только всерьез это использовать станет (что еще ладно), он же это еще и за образец возьмет, когда сам что-нибудь писать будет.

Я на красоту и оптимальность кода не претендую, но ваше решение с использованием массивов мне не кажется сильно лучшим. По-моему, если вы используете массивы, значит вам уже нужен язык программирования.

А у моего решения, как намекнули ниже, есть гораздо большие проблемы.

evilface ★★
()
Ответ на: комментарий от Deleted

как пример, что sed умеет работать с файлами

Это пример того, как sed(1) *не умеет* работать с файлами. В чем нет ничего плохого, поскольку sed, как намекает нам его имя — _s_tream _ed_itor — это *поточный* редактор. Для работы с файлами есть его старший брат — ed(1).

Zmicier ★★★★★
()
Ответ на: комментарий от evilface

Я на красоту и оптимальность кода не претендую

Я ничего вам не говорю про «красоту и оптимальность».

решение с использованием массивов [вместо многодесятикратного пересоздания файла] мне не кажется сильно лучшим

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

По-моему, если вы используете массивы, значит вам уже нужен язык программирования

По-моему, если вы используете буквы, значит вам нужна клавиатура.

В смысле — что вы сейчас сказали?

Zmicier ★★★★★
()
Ответ на: комментарий от evilface

Я не понял, что там у вас «появляется»? Как видно, ГНУ Баш под описанную задачу идеально подошел.

Zmicier ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.