Замените блок строк, используя sed - PullRequest
0 голосов
/ 04 октября 2019

У меня есть некоторые проблемы с sed: мне нужно отредактировать файл конфигурации с помощью sed. Я хочу заменить блок строк.

Вот мой конфигурационный файл: file.php

$status = new GCollection('Status');
$sql = "SELECT status_id,nom from planning_status order by priorite asc";
$status->db_loadSQL($sql);
$smarty->assign('listeStatus', $status->getSmartyData());
// liste de tous les utilisateurs
$listeUsers = new GCollection('User');

Хочу быть

$status = new GCollection('Status');
$sql = "SELECT planning,nom from main_table order by priorite desc";
// liste de tous les utilisateurs
$listeUsers = new GCollection('User');
if($user->checkDroit('tasks_modify_own_task')) {
    $sql = " SELECT *
    FROM planning
}

Я пробовал что-то вроде

RIGHT=$(cat <<- "EOF"
$status = new GCollection('Status');
$sql = "SELECT status_id,nom from planning_status order by priorite asc";
$status->db_loadSQL($sql);
$smarty->assign('listeStatus', $status->getSmartyData());
// liste de tous les utilisateurs
$listeUsers = new GCollection('User');
EOF
)

NEW=$(cat <<- "EOF"
$status = new GCollection('Status');
$sql = "SELECT planning,nom from main_table order by priorite desc";
// liste de tous les utilisateurs
$listeUsers = new GCollection('User');
if($user->checkDroit('tasks_modify_own_task')) {
    $sql = " SELECT *
    FROM planning
}
EOF
)


sed -i 's/$RIGHT/$NEW' file.php

Это моя ошибка:

sed: -e expression #1, char 13: unterminated `s' command

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

Это умный способ выполнения многострочной замены на sed. Конвертируйте все в шестнадцатеричные числа!

to_hex() { xxd -p | tr -d '\n'; }
from_hex() { xxd -p -r; }
to_hex <file | sed "s/$(to_hex <<<"$RIGHT")/$(to_hex <<<"$NEW")/" | from_hex | sponge file

Примечание: губка является частью moreutils.

0 голосов
/ 05 октября 2019

Это может работать для вас (GNU sed и bash):

a=$(sed -z 's/\n/\\n/g' <<<"$RIGHT")
b=$(sed -z 's/\n/\\n/g' <<<"$NEW")
sed -z "s/$a/$b/" file

Строки $ RIGHT и $ NEW содержат символы новой строки, и они будут завершать любую команду sed, они должны быть заключены в кавычки для заменыиметь место. Путем формирования новых переменных и использования опции -z несколько строк в файле могут быть сопоставлены и заменены / удалены.

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

В качестве альтернативы:

sed -z 's/'"$a"'/'"$b"'/g' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...