Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: sed 's/search/replace/'  (Прочитано 1461 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Wogel

  • Автор темы
  • Любитель
  • *
  • Сообщений: 64
    • Просмотр профиля
sed 's/search/replace/'
« : 12 Октября 2022, 14:06:30 »
подскажите пожалуйста, как заменить в /etc/passwd наименование оболочки с /bin/sh на /bin/bash , слэши не позволяют выполнить команду, т.е. sed 's//bin/sh//bin/bash/' так нельзя делать, пробовал путь в переменные засунуть search=/bin/sh , replace=/bin/bash , далее sed 's/$search/$replace/' безрезультатно, не могу найти в инете про такие вещи(

Оффлайн andytux

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 7309
    • Просмотр профиля
Re: sed 's/search/replace/'
« Ответ #1 : 12 Октября 2022, 14:10:09 »
Я уже слышу следующий вопрос: "как восстановить систему..."

Оффлайн Wogel

  • Автор темы
  • Любитель
  • *
  • Сообщений: 64
    • Просмотр профиля
Re: sed 's/search/replace/'
« Ответ #2 : 12 Октября 2022, 14:26:30 »
Я уже слышу следующий вопрос: "как восстановить систему..."
)) ну пока сделал копию, с ней кручу, для простоты объяснения указал именно /etc/passwd

Оффлайн andytux

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 7309
    • Просмотр профиля
Re: sed 's/search/replace/'
« Ответ #3 : 12 Октября 2022, 14:34:02 »
Цитировать
далее sed 's/$search/$replace/' безрезультатно
Тебе уже знаком ABS, почему-бы не продолжить знакомство.
И про "магию разных кавычек" тоже намекали. Цитата из ABS:
Цитировать
В отдельных случаях, команды редактирования не работают в одиночных кавычках.
filename=file1.txt
pattern=BEGIN

  sed "/^$pattern/d" "$filename"  # Результат вполне предсказуем.
# sed '/^$pattern/d' "$filename"    дает иной результат.
#        В данном случае, в "строгих" кавычках (' ... '),
#+      не происходит подстановки значения переменной "$pattern".

Оффлайн Wogel

  • Автор темы
  • Любитель
  • *
  • Сообщений: 64
    • Просмотр профиля
Re: sed 's/search/replace/'
« Ответ #4 : 12 Октября 2022, 14:43:15 »
Цитировать
далее sed 's/$search/$replace/' безрезультатно
Тебе уже знаком ABS, почему-бы не продолжить знакомство.
И про "магию разных кавычек" тоже намекали. Цитата из ABS:
Цитировать
В отдельных случаях, команды редактирования не работают в одиночных кавычках.
filename=file1.txt
pattern=BEGIN

  sed "/^$pattern/d" "$filename"  # Результат вполне предсказуем.
# sed '/^$pattern/d' "$filename"    дает иной результат.
#        В данном случае, в "строгих" кавычках (' ... '),
#+      не происходит подстановки значения переменной "$pattern".

там и ковыряюсь, пока безуспешно.

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 7143
  • Luck Tales
    • Просмотр профиля
Re: sed 's/search/replace/'
« Ответ #5 : 12 Октября 2022, 14:58:22 »
s//bin/sh//bin/bash/
's/\/bin\/sh/\/bin\/bash/'
's#/bin/sh#/bin/bash#'
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн Wogel

  • Автор темы
  • Любитель
  • *
  • Сообщений: 64
    • Просмотр профиля
Re: sed 's/search/replace/'
« Ответ #6 : 12 Октября 2022, 15:11:42 »
s//bin/sh//bin/bash/
's/\/bin\/sh/\/bin\/bash/'
's#/bin/sh#/bin/bash#'
Спасибо, работает, законспектирую на память.

Пользователь добавил сообщение 12 Октября 2022, 16:19:33:
s//bin/sh//bin/bash/
's/\/bin\/sh/\/bin\/bash/'
's#/bin/sh#/bin/bash#'
Подскажите еще пожалуйста, а можно ли подставить в sed переменную, которая по задумке будет номером строки?
sed -i "$numbers/search/replace/"
в строгих кавычках $ не воспринимается ка к знак подстановки, а в двойных не работает, может быть нужно еще какие-то спец символы вставлять?

В общем разобрался, нужно делать так sed -i "${number}s/search/replace/"
« Последнее редактирование: 12 Октября 2022, 18:06:06 от Wogel »

Оффлайн andytux

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 7309
    • Просмотр профиля
Re: sed 's/search/replace/'
« Ответ #7 : 12 Октября 2022, 18:18:51 »
Цитировать
нужно делать так sed -i "${number}s/search/replace/"
Нужно иногда оглядываться. Смотри как похоже.

Оффлайн qpdb

  • Забанен
  • Активист
  • *
  • Сообщений: 628
  • xUbuntu 22.04
    • Просмотр профиля
Re: sed 's/search/replace/'
« Ответ #8 : 12 Октября 2022, 18:22:05 »
Переменные в sed по моему только в двойных кавычках, можно уточнить почитав документацию…
touch test.txt
echo 'Осень она не спросит…' > test.txt ; echo  'Осень она придёт…' >> test.txt
OP=$(echo 'Сделать первой строкой файла test.txt…')
sed -i "1s:^:$OP\n:" test.txt
2022 Oct 12; 11:21 AM

Оффлайн Wogel

  • Автор темы
  • Любитель
  • *
  • Сообщений: 64
    • Просмотр профиля
Re: sed 's/search/replace/'
« Ответ #9 : 12 Октября 2022, 19:09:08 »
\n
Переменные в sed по моему только в двойных кавычках, можно уточнить почитав документацию…
touch test.txt
echo 'Осень она не спросит…' > test.txt ; echo  'Осень она придёт…' >> test.txt
OP=$(echo 'Сделать первой строкой файла test.txt…')
sed -i "1s:^:$OP\n:" test.txt
2022 Oct 12; 11:21 AM
в этом случае нормально выполняется, но , Если поставить переменную в качестве номера строки такой вариант уже не прокатит, только в фигурных скобках. В общем всё заработало. Всем спасибо!

Пользователь добавил сообщение 12 Октября 2022, 19:10:58:
Цитировать
нужно делать так sed -i "${number}s/search/replace/"
Нужно иногда оглядываться. Смотри как похоже.
ага, мой топик)  :idiot2:
« Последнее редактирование: 12 Октября 2022, 21:03:24 от Wogel »

 

Страница сгенерирована за 0.061 секунд. Запросов: 25.