LINUX.ORG.RU
решено ФорумAdmin

замена символов

 , , ,


0

2

Всем привет!

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

★★

Ну очевидно же «при помощи стандартных средств линукса». Только вот не понятно что по этим вы подразумеваете.
А так, bash, awk, sed, perl &etc вам помогут

anc ★★★★★
()
Последнее исправление: anc (всего исправлений: 1)
Ответ на: комментарий от annulen

нет. есть одно слово во всем файле, вместо которого надо вставить список строк.

И еще вдогонку: sed умеет заменять первый найденный шаблон в каждой строке файла?

например, файл вида

123 234 345 123
2345 123 8888 123
kjk opop 124 123 113 123

Должен поменяться к виду (123 меняем на qwe):

qwe 234 345 123
2345 qwe 8888 123
kjk opop 124 qwe 113 123
aido ★★
() автор топика
Ответ на: комментарий от aido

вторую часть сделал через временный файл, но мне кажется, что можно красивее

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

И еще вдогонку: sed умеет заменять первый найденный шаблон в каждой строке файла?

sed - жадный. Есть методы борьбы с ней но не универсальные.

anc ★★★★★
()

А в чем проблема: «прочесть из файла» или «слово д.б. внутри пробелов» ?

anonymous
()

А как при помощи стандартных средств линукса

Что, даже glibc использовать нельзя? Откуда такая задача?

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

«Оболочки»? В первоначальном письме вы говорили про средства ядра. То есть, я понял, вы оговорились.

Оболочка какая? ГНУ Баш? И пробелы во входном файле незначащие (иначе говоря, можно считать, что все слова разделены одним пробелом)? Ну тогда не понимаю, что у вас вызвало такие затруднения, что вы ни строчки не смогли написать, — действительно, хрестоматийная же задача. Как-то так что ли:

#!/bin/bash

word_to_replace='foo'
replacement_file='replacement-file'

while read -r; do
    set $REPLY
    for w; do
        if [[ $w == "$word_to_replace" ]]; then
            printf '\n'
            while read -r; do
                printf '%s\n' "$REPLY"
            done < "$replacement_file"
        else
            printf '%s%c' "$w" "$IFS"
        fi
    done
    printf '\n'
done

Не проверял. Могут быть ошибки вплоть до синтаксических.

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

под линуксом подразумевалась вся ось, а не только ее ядро.

хз. я думал, что есть красивее решение, например, sed-ом навроде f=`cat file` && f=${f//\\/\\\\} && sed -i "s/var/$f/" new_file

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

В файле с именем 123 две строчки (без # и /. и т.д., знакомого sed-у)

qwe
asd
делаем (переводы строки на # и обратно)
echo "123 234 345 123" | sed -e 's/123/'`tr '\012' '#' < 123`'/g' | tr '#' '\012'
получаем
qwe
asd
 234 345 qwe
asd

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

под линуксом подразумевалась вся ось

Зачем так подразумевать? И какая ось-то? ГНУ? Андроид? Еще что-нибудь?

что есть красивее решение, например, sed-ом навроде f=`cat file` && f=${f//\\/\\\\} && sed -i "s/var/$f/" new_file

Вы называете этот набор черточек и скобочек «красивым решением»? Что с вами?

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

sed -e 's/123/'`tr '\012' '#' < 123`'/g' | tr '#' '\012'

во! достаточно красиво!

Не приведи господи сопровождать что-нибудь после вас. Аминь.

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

И еще вдогонку: sed умеет заменять первый найденный шаблон в каждой строке файла?

sed 's/123/qwe/' <<EOF
123 234 345 123
2345 123 8888 123
kjk opop 124 123 113 123
EOF
anonymous
()
Ответ на: комментарий от anonymous
awk -v d="$(cat 123)" 'gsub(/123/, d)+1' <<EOF
123 234 345 123
EOF
anonymous
()
Ответ на: комментарий от Zmicier

Не приведи господи сопровождать что-нибудь после вас. Аминь.

sed не зря был придуман (и все остальные утилиты). Грех ими не пользоваться в хвост и в гриву. А то потом видишь такие портянки кода для простых замен текста и забываешь про то, зачем же все же я пишу программу...

И да: Perl мне больше, чем Python нравится.

Зачем так подразумевать? И какая ось-то? ГНУ? Андроид? Еще что-нибудь?

Зачем так занудничать? в тегах к посту же указаны были возможные стандартные утилиты. Если б мне такое понадобилось в кернеле, я бы прямо об этом сказал. Хотя если б мне действительно замена текста понадобилась именно в пространстве ядра, то мне и вправду надо было бы оторвать руки. Аминь=)

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

в тегах к посту же указаны были возможные стандартные утилиты

А их читать надо, да? Они просто в ленту (RSS) не попадают.

Грех ими не пользоваться

Грех писать программы, которые невозможно читать. Вы сами-то можете сходу понять и об’яснить, что происходит в примере, что вы назвали «красивым»?

замена текста понадобилась именно в пространстве ядра

Почему «в пространстве»? «Средствами». Средствами Линукса.

Это вполне решаемая задача, и я допускаю, что она вполне реально может встать — сейчас наступила эпоха странных ЭВМ, типа ЭВМ в корпусе бытовой лампочки, где вполне может обнаружиться вырожденная ось в виде одной единственной программы, крутящейся поверх Линукса.

И если к ней подходить буквально, то надо архитектуру процессора уточнить, ибо понадобятся ассемблерные вставки. А если не буквально, то в таком случае будет проще просто собрать программу с какой-нибудь libc статически.

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

Вы сами-то можете сходу понять и об’яснить, что происходит в примере, что вы назвали «красивым»?

f=`cat file` && f=${f//\\/\\\\} && sed -i «s/var/$f/» new_file

в переменную f считываем содержимое файла file, после этого экранируем символы перевода на новую строку, чтобы sed мог с ними работать, потом запускаем sed c опцией -i для замены по шаблону первого вхождения var на содержимое f в файле new_file. Вот только нечто подобное работает для первого вхождения во всем файле, а если сделать «s/var/$f/g» - то вообще во всем файле. Вопрос был в том, какие ключи в регулярке надо скормить sed-у, чтобы обрабатывал каждую строку до первого вхождения.

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

а. ну так там файл раскатывается в одну строчку, затем идет замена на эту строчку, затем восстановление после это раскатывания

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

Если только так то да, то ТС вначале вроде говорил про слово.

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