【问题标题】:Use sed to replace text containing quotes and single quotes使用 sed 替换包含引号和单引号的文本
【发布时间】:2014-01-18 23:51:01
【问题描述】:

我正在尝试在我的服务器上搜索名为 index.php 的所有文件,然后使用 xargs 运行 sed 来替换这些文件中的一些文本。

我要查找的行是:

echo '<form method="get" class="search_form" action="'.$siteUrl.'">';

替换后应该是这样的:

echo '<form method="get" class="search_form" action="/">';

因此,我真的只需要将'.$siteUrl.' 更改为单个/

但是,当我尝试从 SSH 提示符运行此命令时(我认为这是正确的):

find . -name "index.php" -print | xargs sed -i 's/\'\.\$siteUrl\.\'/"/"/g'

它只是让我进入 > 的提示,并且没有进一步...

我也尝试在单个文件上使用相同的 sed 命令,效果相同。谁能指出我哪里出错了?

【问题讨论】:

    标签: linux search sed find xargs


    【解决方案1】:
    • 您正在用/ 替换文本,/ 也用作替换分隔符。像这样逃避它:\/
    • 无需在替换前后加上双引号,因为它们已经存在于 html 字符串中。
    • 在整个 sed 表达式周围使用双引号,以避免与 ' 冲突
    • -printfind 的默认操作,可以跳过。

    试试这个:

    find . -name "index.php" | xargs sed -i "s/'\.\$siteUrl\.'/\//g"
    

    或者对 sed 使用不同的分隔符,例如 : 并删除 / 之前的转义:

    find . -name "index.php" | xargs sed -i "s:'\.\$siteUrl\.':/:g"
    

    哦,保存已编辑文件的备份总是一个好主意 (-i.bak):

    find . -name "index.php" | xargs sed -i.bak "s:'\.\$siteUrl\.':/:g"
    

    【讨论】:

    • 谢谢 - 第二个很好!新年快乐:)
    • 也感谢您提供额外的备份选项.. :)
    猜你喜欢
    • 2011-06-19
    • 2016-08-10
    • 1970-01-01
    • 2023-03-02
    • 1970-01-01
    • 2013-10-19
    • 2017-08-05
    • 2020-08-09
    • 1970-01-01
    相关资源
    最近更新 更多