Intereting Posts
Поиск строки, с успехом Поиск ближайшего шаблона Печатать текст между (и включая) двумя разделителями по строке Как подключиться удаленно к серверу airserv-ng? Как заменить одиночное или двойное пространство в текстовом файле, когда между кавычками Запуск сценария Python в виртуальной среде Conda в качестве службы Как изменить цикл for? Тестирование Debian Приостановка проблем Vim Error 'E212: невозможно открыть файл для записи' при попытке создания новых файлов вне домашнего каталога awk: добавьте поле автоинкремента в файл Паника ядра в гостевой системе KVM после Fedora 27 – обновление libvirt Переписывание файлов, найденных поиском? что интерфейс lpsched обеспечивает, что чашки не делает? Найти, когда новое оборудование подключено к FreeBSD Как мне chmod или chown файл, чтобы любой в мире мог получить к нему доступ? Как извлечь значения ресурсов, указанных в директиве PBS, чтобы они могли отображаться в другие переменные среды?

как поменять текст внутри файлов

Внутри моего файла мне нужно поменять местами всех экземпляров:

grep 'search string' 

а также

 sed '/string of text/,/string of text/{//!d}' 

В VI я пробовал регулярное выражение без везения – он говорит что-то о завершающих символах.

 :%s/grep 'search string'/sed '/string of text/,/string of text/{//!d}'/g 

Я также пытался с sed вне файла: который говорит, что событие не найдено

 sed -i 's/grep 'search string'/sed '/search string/,/search string/{//!d}'/g' filename. 

Что я делаю неправильно и как я могу заставить это работать? У меня слишком много случаев, которые мне нужно изменить, и сделать это вручную – это не вариант.

Я хочу изменить эту строку кода:

 succ_1st=`grep 'resulted in successful answer' $path_tmp/named.stats.tmp | sed '/localhost.localdomain/,/testdns.net/{//!d}' | awk '{ print $1 }' | grep -m1 ''` 

к этому:

 succ_1st=`sed '/localhost.localdomain/,/testdns.net/{//!d}' $path_tmp/named.stats.tmp | grep 'resulted in successful answer' | awk '{ print $1 }' | grep -m1 ''` 

Вот строки кода из скрипта BTW

Для вашего первого вопроса

Для того, чтобы эта команда работала, ограничитель изменений помогает. Кроме того, одиночные кавычки внутри команды sed должны быть надлежащим образом экранированы для защиты их от оболочки:

 sed 's|grep '\''search string'\''|sed '\''/search string/,/search string/{//!d}'\''|g' file 

Например, используя этот тестовый файл:

 $ cat file grep 'search string' 

Вышеупомянутая команда производит:

 $ sed 's|grep '\''search string'\''|sed '\''/search string/,/search string/{//!d}'\''|g' file sed '/search string/,/search string/{//!d}' 

Чтобы изменить файл на месте, добавьте флаг -i :

 sed -i 's|grep '\''search string'\''|sed '\''/search string/,/search string/{//!d}'\''|g' file 

Для вашего второго вопроса

 sed -r 's/(grep[^$]*)([$][^|]*)[|] (sed[^|]*)/\3\2| \1/' filename 

Например, рассмотрим этот тестовый файл:

 $ cat filename succ_1st=`grep 'resulted in successful answer' $path_tmp/named.stats.tmp | sed '/localhost.localdomain/,/testdns.net/{//!d}' | awk '{ print $1 }' | grep -m1 ''` 

Эта команда производит:

 $ sed -r 's/(grep[^$]*)([$][^|]*)[|] (sed[^|]*)/\3\2| \1/' filename succ_1st=`sed '/localhost.localdomain/,/testdns.net/{//!d}' $path_tmp/named.stats.tmp | grep 'resulted in successful answer' | awk '{ print $1 }' | grep -m1 ''` 

Чтобы изменить файл на месте, добавьте флаг -i :

 sed -ir 's/(grep[^$]*)([$][^|]*)[|] (sed[^|]*)/\3\2| \1/' filename 

Команды Vi

Первая команда выше может быть выполнена в vim с:

 %s/grep 'search string'/sed '\/search string\/,\/search string\/{\/\/!d}'/g 

Команда swap может быть выполнена внутри vim с помощью:

 %s/\v(grep[^$]*)([$][^|]*)[|] (sed[^|]*)/\3\2| \1/ 

Не sed, в основном bash:

 string=$(cat <<'END' succ_1st=`grep 'resulted in successful answer' $path_tmp/named.stats.tmp | sed '/localhost.localdomain/,/testdns.net/{//!d}' | awk '{ print $1 }' | grep -m1 ''` END ) var=$(cut -d'`' -f1 <<<"$string") code=$(cut -d'`' -f2 <<<"$string") IFS='|' read -ra commands <<<"$code" filename=$( set -f; eval set -- "${commands[0]}"; echo ${!#} ) # danger tmp=${commands[0]//${filename//\//\\\/}/} commands[0]="${commands[1]} $filename" commands[1]=$tmp printf -v new '%s`%s`' "$var" "$(IFS='|'; echo "${commands[*]}")" echo "$new" 
 succ_1st=` sed '/localhost.localdomain/,/testdns.net/{//!d}' $path_tmp/named.stats.tmp|grep 'resulted in successful answer' | awk '{ print $1 }' | grep -m1 ''`