Форум программистов, компьютерный форум, киберфорум
Shell, Bash
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/103: Рейтинг темы: голосов - 103, средняя оценка - 4.63
52 / 18 / 11
Регистрация: 27.03.2013
Сообщений: 789
1

Замена слов в файле, используя утилиту - sed

02.06.2017, 13:54. Показов 19516. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть необходимость менять слова в файлах

Утилита sed позволяет это сделать так

Bash
1
sed s/ОБРАЗЕЦ/ЗАМЕНА/
Вот сценарий

Кликните здесь для просмотра всего текста
Bash
1
2
3
4
5
6
 echo -e  " По утрам он делал зарядку.\r
 Молния - электрический заряд." > zar.txt
 cat ./zar.txt
 
# sed 's/заряд/разряд/' < ./zar.txt > ./zar.txt
 sed 's/заряд/разряд/' zar.txt


Но в итоге конечный файл не меняется.

Подскажите пожалуйста как разрешить данную ситуацию ?

Как написать образец если нужно изменить сразу несколько слов или вообще предложений?

Написать для каждого слова в отдельной строке команду ?

Добавлено через 28 минут
Вернее файл меняется, но меняется найденное первое совпадение.

Если указать

Bash
1
 sed 's/заряд/разряд/g' ./zar.txt
То поиск и замена будет по всему тексту

Но почему он не делает строго по шаблону и меняет , в данном случае, и другие слова, например слово зарядка поменял на разрядка ?

Добавлено через 25 минут
А вот в данном примере изменения выводятся только на экран, но сам файл не изменяется, почему это может быть?

Кликните здесь для просмотра всего текста
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
echo -e "[share]" > ./smb-edit.conf
echo -e "\tcomment = Ubuntu File Server Share\r
    \tpath = /home/alex/samba/share\r
    \tbrowsable = yes\r
    \tguest ok = yes\r
    \tread only = no\r
    \tcreate mask = 0756
    \tcreate mask2 = 0756
    
    " > /home/alex/scripts/tmp/smb-edit.conf
 
sed  "s/\tcreate mask = 0756/\tcreate mask = 0000/" ./smb-edit.conf
 
gedit ./smb-edit.conf


В предыдущем примере так же... не изменяется конечный файл.

Sed не меняет данные в обрабатываемом файле. Редактор читает файл, обрабатывает прочитанное, и отправляет то, что получилось, в STDOUT.
При необходимости вывод sed можно перенаправить в файл, возможно — перезаписать старый файл.
Как перенаправить вывод в этот же файл и перезаписать найденную строчку?

Добавлено через 1 час 49 минут
Разобрался с ответом на один из своих вопросов :

Цитата Сообщение от masli Посмотреть сообщение
Как написать образец если нужно изменить сразу несколько слов или вообще предложений?
Написать для каждого слова в отдельной строке команду ?
Для выполнения нескольких действий с данными, используйте ключ -e при вызове sed.
Кликните здесь для просмотра всего текста
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
echo -e "[share]" > ./smb-edit.conf
echo -e "\tcomment = Ubuntu File Server Share\r
    \tpath = /home/alex/samba/share\r
    \tbrowsable = yes\r
    \tguest ok = yes\r
    \tread only = no\r
    \tcreate mask = 0756
    \tcreate mask2 = 0756
    
    " > /home/alex/scripts/tmp/smb-edit.conf
    
    cat ./smb-edit.conf
    pause
 
sed -e  "s/\tcreate mask = 0756/\tcreate mask = 0000/; s/\tguest ok = yes/\tguest ok = no/"  ./smb-edit.conf
 
sed -e  "s:\tcreate mask = 0756:\tcreate mask = 1111:; s:\tguest ok = yes:\tguest ok = NO:"  ./smb-edit.conf


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

И изменение точно заданного шаблона.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.06.2017, 13:54
Ответы с готовыми решениями:

Замена слов в файле
Помогите плиз.Как реализовать данную программу?: В первом файле находиться текст.Второй файл...

Замена слов в файле
можете исправить ошибки: 1.Элементами типизированного файла являются отдельные слова. Изменить все...

Замена слов в файле
1. открыть через fopen один файл на чтение, второй на запись. 1.1 количество замен=0 2....

Замена слов в файле
Помогите, пожалуйста, исправить код. Нужно : 1. Чтобы замена производилась независимо от...

6
Эксперт NIX
2795 / 2038 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
02.06.2017, 14:22 2
Цитата Сообщение от masli Посмотреть сообщение
непосредственном изменении самого файла
Код
sed --help
…
  -i[СУФФИКС], --in-place[=СУФФИКС]
                 правка файлов на месте (создаёт копию, если указан СУФФИКС)
Добавлено через 3 минуты
И немного проще
Bash
1
2
sed '/^\tcreate mask = /s/\S*$/0000/
     /^\tguest ok = /s/yes/no/'  ./smb-edit
0
52 / 18 / 11
Регистрация: 27.03.2013
Сообщений: 789
05.06.2017, 12:19  [ТС] 3
Вот код, ничего не редактируется, создается только резервная копия...
В чем здесь может быть ошибка ?

Мне интересен вариант с использованием /\S*$/.

Кликните здесь для просмотра всего текста
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
sed --in-place=.bak -e "/^\tcreate mask = /s/\S*$/0000/
 /^\tguest ok = /s/yes/no/" ./smb-edit.conf
     
# ^ - данный символ означает начало строки, 
# но иногда, в зависимости от контекста, означает 
# отрицание в регулярных выражениях
# Сам символ слэш '/', хотя и не является специальными символом 
# в регулярных выражениях, но открывает-закрывает regexp в синтаксисе 
# /...pattern.../
# \S , где - не пробельный символ
# Звездочка -- * -- означает любое количество символов в строке, 
# предшествующих "звездочке", в том числе и нулевое число символов.
# то есть любое количество не пробельных символов
# Знак доллара -- $ -- в конце регулярного выражения соответствует концу строки.
# /^\tcreate mask = / - шаблон поиска
# s/\S*$/0000/, где 
# /\S*$/ - /образец/
# /0000/ - /замена/
# между предложениями можно не ставить точку символ ';' 
# если другое предложение переноситься на новую строку
 
 # -i[SUFFIX], --in-place[=SUFFIX]
 # редактировать файлы на месте (делает резервное копирование, если указан суффикс)


Правильно ли я понял ваш код ?

А вот так работает, но возможности данной команды ограничены

Кликните здесь для просмотра всего текста
Bash
1
2
sed --in-place=.bak -e "s/\tcreate mask = 0756/\tcreate mask = 0000/
                          s/\tguest ok = yes/\tguest ok = no/" ./smb-edit.conf
0
Эксперт NIX
2795 / 2038 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
05.06.2017, 21:04 4
Замените ^\t на ^\s*
0
52 / 18 / 11
Регистрация: 27.03.2013
Сообщений: 789
07.06.2017, 17:43  [ТС] 5
Цитата Сообщение от Marinero Посмотреть сообщение
Замените ^\t на ^\s*
Заменил

Кликните здесь для просмотра всего текста
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
echo -e "[Share]\r
\tcomment = Ubuntu File Server Share\r
\tpath = /home/alex/samba/share\r
\tbrowsable = yes\r
\tguest ok = yes\r
\tread only = no\r
\tcreate mask = 0756
\tcreate mask = 0000 " > ./smb-edit-2.conf
 
pause
 
sed --in-place=.bak -e "/^\s*create mask = /s/\S*$/0000/
 /^\s*guest ok = /s/yes/no/" ./smb-edit-2.conf



Кроме этого sed дописал к последней строке еще 4 нуля, почему ?

Кликните здесь для просмотра всего текста
[Share]
comment = Ubuntu File Server Share
path = /home/alex/samba/share
browsable = yes
guest ok = no
read only = no
create mask = 0000
create mask = 0000 0000
0
Эксперт NIX
2795 / 2038 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
07.06.2017, 20:35 6
Лучший ответ Сообщение было отмечено Marinero как решение

Решение

Bash
1
sed --in-place "/^\s*create mask = /s/\S*\s*$/0000/
1
52 / 18 / 11
Регистрация: 27.03.2013
Сообщений: 789
08.06.2017, 09:56  [ТС] 7
Все работает.

Вот полное решение, с комментариями (как я это понимаю)

Кликните здесь для просмотра всего текста
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#!/usr/bin/env bash
function pause(){
   echo
   #read -p "$*"
   #m="Нажмите любую клавишу или подождите 3 секунды для продолжения..."
   m="Нажмите любую клавишу для продолжения..."
   # read -n 1 -t 3 -p "$m"
   read -n 1 -p "$m"
   echo
}
 
title (){
echo
echo -e "---------------- $1 ----------------\n"
}
mes (){
echo -e "$1  \n" 
}
echo -e "[Share]\r
\tcomment = Ubuntu File Server Share\r
\tpath = /home/alex/samba/share\r
\tbrowsable = yes\r
\tguest ok = yes\r
\tread only = no\r
\tcreate mask = 0756
\tcreate mask = 0000 " > ./smb-edit-2.conf
pause
 sed -r --in-place=.bak -e   "/^\s*create mask = /s/\S*\s*$/0000/
 /^\s*guest ok = /s/yes/no/" ./smb-edit-2.conf
 
 # /\S*\s*$/ - образец для поиска
# \S - не пробельный символ
# * - любое количество символов в строке
 # S* - любое количество не пробельных символов (то есть любых символов, кроме пробела) в строке
# s* - любое количество символа "пробел"
 
# -e - добавление скрипта или regex в исполняемые команды
# -r - использовать расширенный синтаксис регулярных выражений
# (спец символы активны по умолчанию)
               
 # ^ - данный символ означает начало строки, 
# но иногда, в зависимости от контекста, означает 
# отрицание в регулярных выражениях
# Сам символ слэш '/', хотя и не является специальными символом 
# в регулярных выражениях, но открывает-закрывает regexp в синтаксисе 
# /...pattern.../
# \S , где - не пробельный символ
# Звездочка -- * -- означает любое количество символов в строке, 
# предшествующих "звездочке", в том числе и нулевое число символов.
# то есть любое количество не пробельных символов
# Знак доллара -- $ -- в конце регулярного выражения соответствует концу строки.
# /^\tcreate mask = / - шаблон поиска
# s/\S*$/0000/, где 
# /\S*$/ - /образец/
# /0000/ - /замена/
# между предложениями можно не ставить точку символ ';' 
# если другое предложение переноситься на новую строку
 
 # -i[SUFFIX], --in-place[=SUFFIX]
 # редактировать файлы на месте (делает резервное копирование, если указан суффикс)


Решено.
0
08.06.2017, 09:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.06.2017, 09:56
Помогаю со студенческими работами здесь

Замена слов в одном текстовом файле словами, записанными в другом текстовом файле
Кто-нибудь пожалуйста приведете пример реализации следующей программы имеются два тектовых файла -...

Замена слов в текстовом файле
Здравствуете! Очень требуется помощь. Вот проблема. Нужен батник, который будет менять в файлах,...

Замена нужных слов в файле
Дан файл. Предложить пользователю ввести номер слова, которое он хочет заменить точками(.), вывести...

Замена слов в текстовом файле
Нужна помощь, как в текстовом файле изменить слово, например, &quot;Black&quot; на &quot;White&quot;?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru