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

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

 , , ,


0

2

Всем привет!

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

★★
Ответ на: комментарий от 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 -e 's/123/'`tr '\012' '#' < 123`'/g' | tr '#' '\012'

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

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

Zmicier ★★★★★
()
Ответ на: комментарий от 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 ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.