LINUX.ORG.RU

Поиск слова или строки в файле

 , , ,


0

1

Вообщем нужно сделать так чтобы в файле находил слово или строку с словом «Привет», читал 2 символа и писал "." . ПРИМЕР РАБОТЫ: Пр.ивет.

Дан текст: Собака и кот,(1 строка) Друг и враг,(2 строка) Привет всем.(3 строка)

Итог: Собака и кот, Друг и враг, Пр.ивет всем.

Пожалуйста объясните как так делать!

Для поиска строки в файле тебе поможет утилита grep, а для простановки точки после Пр поможет утилита sed и регулярные выражения.

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

Товарищ про Баш, а вы ему Греп да Сед. Еще бы Перл предложили. Не говоря уж о том, что при наличии Седа, тут Греп нафиг не нужен.

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

Написать на «чистом» bash даже без sed и grep можно, но будет уж слишком криво.

А так, все скрипты на bash как раз таки и пишутся с применением внешних утилит, в том числе grep и sed. Одним sed не обойтись, при условии что нужно выбрать строки с Привет.

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

Одним sed не обойтись, при условии что нужно выбрать строки с Привет.

Как это? sed вполне может это сделать.

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

я походу понял что я много не знаю) Не посоветуете хороший учебник или сайт по терминалу

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

Зачем cat?

sed -i
Ну, и неясно ещё: первые два символа — это из всей строки или конкретно из слова «Привет».

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

Написать на «чистом» bash даже без sed и grep можно, но будет уж слишком криво.

Серьезно? А мне почему-то кажется, что это у вас будет криво, если вы к простой замене слова на другое (а именно это, товарищу школьнику, если перевести его заумь, всего-то и надо) подойдете сразу с двумя внешними утилитами и оболочной.

На ГНУ Баше же как-то так:

#!/bin/bash
while read -r; do
    printf '%s\n' "${REPLY//Привет/Пр.ивет}"
done

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

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

а как мне допустим сделать это только через grep, red, echo, cat ? то есть мне нужно изменить файл переписав его только этими командами

rebootcomp ()
Ответ на: комментарий от rebootcomp
sed -ie "/Привет/Is/^\(..\)/\1./" /path/to/file

UPD: добавил немного регистронезависимости.

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

cat /path/to/file | sed -e 's/Привет/Пр\.ивет/'

Ему, вроде (по крайней мере по тому, как сформулировано), надо, чтобы точка была после первых двух символов строки, содержащей «Привет». Фишка в том, что строка не обязана начинаться с «Привет». То есть (опять же, если я правильно перевёл то, что понаписано), строка «Привет всем» становится «Пр.ивет всем», а строка «Всем Привет» становится не «Всем Пр.ивет», а «Вс.ем Привет». Так что такой хак не пойдёт ☺

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

Если следовать ТЗ, то в начале автор хочет выбрать строки.

В вашем примере сделайте регистронезависимую замену, вдруг там ПРИВЕТ, а не Привет, ну и с учётом, что на выходе должно получиться ПР.ИВЕТ, а не Пр.ивет.

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

а как мне допустим сделать это только через grep, red, echo, cat? мне нужно изменить файл переписав его только этими командами

Из перечисленного необходим и достаточен только red. Все остальное — лишнее.

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

почему?

Я так понимаю, это вы так не можете сформулировать просьбу написать и это за вас? Окей.

$ red rebootcomp.in
69
,p
Собака и кот.
Друг и враг.
Привет всем.
,s/Привет/Пр.ивет 
Пр.ивет всем.
w
70
Собака и кот.
Друг и враг.
Пр.ивет  всем.
q
Zmicier ★★★★★ ()
Последнее исправление: Zmicier (всего исправлений: 1)
Ответ на: комментарий от Zmicier

Какой будет следующий шаг, т. rebootcomp? Вы спросите, как это сформулировать неинтерактивно?

#!/bin/sh

red rebootcomp.in << EOF
,s/Привет/Пр.ивет
w
q
EOF

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

Какой будет следующий шаг, т. rebootcomp? Вы спросите, как это сформулировать неинтерактивно?

а что это вообще такое?

Ну надо же! Я вас откровенно недооценил!

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

Я вас откровенно недооценил!

А впрочем ладно, из $ red --help понять что-нибудь действительно сложно. Вот что это:

   GNU ed is a line-oriented text editor. It is used to create, display,
modify and otherwise manipulate text files, both interactively and via
shell scripts. A restricted version of ed, red, can only edit files in
the current directory and cannot execute shell commands.

— (info "(ed) Top")

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

а можете сделать иначе, например пошагово как тут

echo 1234567890 > File # Записать строку в файл «File». exec 3<> File # Открыть «File» и связать с дескриптором 3. read -n 4 <&3 # Прочитать 4 символа. echo -n . >&3 # Записать символ точки. exec 3>&- # Закрыть дескриптор 3. cat File # ==> 1234.67890

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

есть данные :

123456789

йцукенгшщз

qwertyuiop

моя цель найти слово «qwertyuiop» прочитать там 4 символа и поставить точку, чтобы вышло вот так «qwer.tyuiop»????

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

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

Жаль, что поздно.

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

sed s/Привет/Пр\.ивет/g

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

Пипец, какой мастер запутывания тут нарисовался с какими-то «котами» и «приветами», хотя ему надо просто в массиве текста проставить десятичный разделитель в некоторых числах.

Но, топик познавательный. Узнал первый раз в жизни, что есть какой-то там «red» и он даже работает.

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

Узнал первый раз в жизни, что есть какой-то там «red» и он даже работает.

Работает. Но, откровенно говоря, оснований использовать его в программах вместо неусеченного ed(1)’а я представить не могу.

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

Кстати, да — очень похоже, только я думаю, что во всех. Интересно только, нахрена приучать школьников работать с числами, как со строками. Или это нормально:

#!/bin/bash

shopt -s extglob

while read -ra words; do
    for word in "${words[@]}"; do
        if [[ $word == +([0-9]) ]]; then
            if (( ${#word} <= 4 )); then
                printf '0.%04d ' "$word"
            else
                printf '%d.%d ' "${word: 0:-4}" "${word: -4}"
            fi
        else
            printf '%s ' "$word"
        fi
    done
    printf '\n'
done
Zmicier ★★★★★ ()
Последнее исправление: Zmicier (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.