【问题标题】:Replace block of lines using sed使用 sed 替换行块
【发布时间】:2020-02-02 20:50:52
【问题描述】:

我在使用 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

【问题讨论】:

标签: linux sed replace


【解决方案1】:

这是用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

注意:sponge 是 moreutils 的一部分。

【讨论】:

  • 我看到了一个错误,例如文件有 4 个字节 0xaa, 0xbb, 0xaa, 0xbb,我们想用 0xba, 0xab 替换一些东西。然后sed 看到aabbaabb 并替换baab,这不是本意。为了更安全,最好在to_hex 中的每个十六进制字节sed 's/../&amp; /g' 之后添加空格,因此区分字节的开头和结尾。 xxd -p -c1 | tr '\n' ' ' 看起来很适合 to_hex
【解决方案2】:

这可能对你有用(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 命令,它可能会被 shell 插值,这可能会导致不必要的副作用,请注意!

或者:

sed -z 's/'"$a"'/'"$b"'/g' file

【讨论】:

  • 首先感谢您回答我有以下输出sed: -e expression #1, char 206: unknown option to `s' (我已用 $NEW 修复了 b 变量)
  • 在 NEW 或 RIGHT 中是否有 / 字符?他们也必须逃脱。或者只是尝试不可读的字符。 sed -z "s\x01$a\x01$b\x01"
猜你喜欢
  • 2010-11-24
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 2012-10-14
  • 2010-10-27
  • 2021-09-25
  • 2013-10-04
相关资源
最近更新 更多