Замените строку в файле на другую, где оба сохраняются в переменных

Я хочу заменить строку, найденную в файле, другой строкой, но оба имеют специальный символ (в этом примере это символ.), Например 1.0 и 2.0 .

Итак, это команда, используемая в настоящее время:

 sed -i 's/1\.0/2\.0/g' /home/user1/file1.txt 

Что делать, если 1.0 и 2.0 были сохранены в переменных $i и $j ? где i имеет значение 1.0 а j имеет значение 2.0 , как я могу поменять i на j ?

3 Solutions collect form web for “Замените строку в файле на другую, где оба сохраняются в переменных”

Вы можете просто использовать sed для исправления для вас:

 printf '%s\n' "$i" "$j" | sed 's/[]\$*&/.^[]/\\&/g;H;$!d x;y|\n|/|;s|.*|s&/g|' | sed -f - /path/to/infile 

Таким образом, это s/// ubstitution будет избегать любых / всех метасимволов BRE во вводе:

 s/[]\$*&/.^[]/\\&/g 

… путем префикса каждой обратной косой черты. Первый sed затем сохраняет копию первой строки – $i – в старом пространстве H добавляя к ней символ \n ewline. Линия $i затем выставляется, потому что она ! а не $ last. Следующая строка – строка $j – также является последней, и после того, как она получает то же самое, что и первое, она не сглажена. Вместо этого e x изменяет буферы удержания и шаблонов и работает с конкатенированными результатами. В этот момент пространство шаблонов выглядит так:

 \n1\.0\n2\.0 

… так что мы y/// переводим все \n ewlines для / slashes, s/// ubstitute .* все пространство шаблонов для & self плюс добавленные s и добавленные /g которые нас получают:

 s/1\.0/2\.0/g 

Затем он автоматически переходит во второе седло, которое читает stdin – или -f - – как его скрипт. Когда первый sed закончен и закрывает трубку между ними, второй sed начинает применять …

 s/1\.0/2\.0/g 

… для каждой строки в названном входном файле – здесь /path/to/infile .

Я написал ваш файл следующим образом:

 printf '%04s%04s%04s%04s\n' \ 0 0 -1 0 1 0 0 0 0 -1\ 0 0 1.5 2.0 1.0 0 >/tmp/temp 

Который достал мне файл вроде …

  0 0 -1 0 1 0 0 0 0 -1 0 0 1.5 2.0 1.0 0 

Затем я написал другую версию вашего скрипта:

 ii=0.0 for i in 1.0 2.0 3.0 4.0 do str2=$i printf '\033[41m## %s \033[0m\n' \ "str2 = $str2" "$ii $str2" printf %s\\n "$ii" "$str2" ii=$str2 done | sed ' s/[]\$^&*./[]/\\&/g;H;x s|^\(\n\)\(.*\)\n\(.*\)\n\(.*\)\n\(.*\)|\ bs\5\1:i\5\1i\\\1\2\\\1\3\1:s\5\1s/\4/\5/gp;ti\5|p s

;h;d' | sed -f – /tmp/temp

Который использует оболочку только для генерации строк, но позволяет sed выполнять всю обработку данных. Обратите внимание, что хотя два sed s называются каждый, их только называют один раз.

Когда я запускаю его, результаты:

  0 0 -1 0 1 0 0 0 0 -1 0 0 1.5 2.0 2.0 0 ## str2 = 2.0 ## 1.0 2.0 1.5 3.0 3.0 0 ## str2 = 3.0 ## 2.0 3.0 1.5 4.0 4.0 0 ## str2 = 4.0 ## 3.0 4.0 1.5 4.0 4.0 0 

Строки, начинающиеся с # , окрашены в красный цвет, как я ожидаю, вы хотите, чтобы они были. sed только записывает их, когда s/// ubstitution успешно. Скрипт, который первый sed пишет для второго, выглядит так:

  bs1\.0 :i1\.0 i\ [41m## str2 = 1\.0 [0m\ [41m## 0\.0 1\.0 [0m :s1\.0 s/0\.0/1\.0/gp;ti1\.0 bs2\.0 :i2\.0 i\ [41m## str2 = 2\.0 [0m\ [41m## 1\.0 2\.0 [0m :s2\.0 s/1\.0/2\.0/gp;ti2\.0 bs3\.0 :i3\.0 i\ [41m## str2 = 3\.0 [0m\ [41m## 2\.0 3\.0 [0m :s3\.0 s/2\.0/3\.0/gp;ti3\.0 bs4\.0 :i4\.0 i\ [41m## str2 = 4\.0 [0m\ [41m## 3\.0 4\.0 [0m :s4\.0 s/3\.0/4\.0/gp;ti4\.0 

Обратите внимание, что, хотя кажется, что [ строки не экранированы, это только эффект моего терминала на выходе), который завершает прием символа сразу после \033 . Когда второй sed получает скрипт, вход подобен \033\[... но вывод, который он выводит на stdout, – это \033[...

попробуйте это: Escape all. заменяя все . to \.

 str1="$( echo -n $i | sed 's/\./\\\./g' )" 

повторите то же самое для str2, используя $ j . затем заменим следующим образом

 sed "s/$str1/$str2/g" 
  • Один слот для сортировки и uniq двух выходов
  • Почему этот эхо-вызов перезаписывает существующий текст?
  • Как изменить переменные
  • Нельзя отступать heredoc, чтобы соответствовать отступу вложенности
  • / dev / null-like автоматический каталог мусора для перемещения файлов?
  • Печать эха в файле и запрос параллельно
  • Использование rsync в cronjob при необходимости пароля
  • Область локальных переменных в функциях оболочки
  • Удалите все, кроме последнего n файла для каждой группы файлов, которые имеют один и тот же префикс в каталоге
  • set -A команда не запущена в Linux
  • Выполнение функции bash из командной строки
  • Interesting Posts

    распечатать сообщение на терминале, а также / var / log / messages с помощью регистратора

    эквивалент linux / bash для mv -t

    Доступ к исполняемому экземпляру MATLAB из командной строки

    Предупреждения о файловых системах только для чтения при установке пакета solaris

    Файлы восстановления / var / cache

    fetchmail: выборка отправленной почты для отправленной папки или выборка в целевую папку

    Создание программ Ubuntu для Fedora через «chroot»

    Сгенерировать время как выражение 1 / 1000th дня дня

    Я @localhost или @ computer-5?

    Какое программное обеспечение имеет все дистрибутивы Linux?

    SSD дает ошибки загрузки DMA, в то время как smartctrl не показывает ошибок

    Двойная загрузка Ubuntu и Windows 8. w8 загружается через оболочку grub, но не из меню

    Лучший способ добавить альтернативу, используя альтернативы обновлений?

    Общайтесь между двумя машинами без переключателя

    Ошибка Vim E138: не удается написать файл viminfo $ HOME / .viminfo!

    Linux и Unix - лучшая ОС в мире.