【问题标题】:Using SED within a shell to replace pattern in desired files [duplicate]在外壳中使用 SED 替换所需文件中的模式 [重复]
【发布时间】:2016-07-26 20:13:03
【问题描述】:

我有一个 bash shell 脚本,如下所示:

#!/bin/bash
#arg1: pattern to be found
#arg2: pattern to be replaced
#arg3: filename pattern
echo replace $1 by $2 for all $3 files
for  i in `find . -type f -name "$3"`
do
sed  's/$1/$2/g' $i
done

我使用这个脚本(比如说,称为 SUBS)作为:

./SUBS bbb ddd aa

文件aa所在的位置:

aaaa
bbbb
cccc

但是,虽然我希望看到 bbbb 被替换为 dddb,但它显示了相同的内容,即 bbbb。 任何线索这里有什么问题? 另外,我想在替换后修改相同的文件。我怎样才能做到这一点? 这个 Qs 与 sed substitution with bash variables 有点相似,但在我的 Qs 中,我使用了一个模式来查找和替换作为 shell 变量的参数。

【问题讨论】:

    标签: bash shell sed


    【解决方案1】:

    变量放在单引号内时不会展开;你需要使用双引号:

    sed "s/$1/$2/g" "$i"
    

    就地修改文件:

    sed -i.bak "s/$1/$2/g" "$i"
    

    操作后原文件将备份为.bak扩展名;如果您不想保留备份:

    sed -i "s/$1/$2/g" "$i"
    

    【讨论】:

    • 非常感谢。我想在替换后修改相同的文件。我怎样才能做到这一点?它现在显示在标准输出上
    • @Dr.DebasishJana 检查我的编辑..
    • 我使用的是 Solaris,不支持 sed -i,还有其他选择吗?
    • @Dr.DebasishJana 我没有 Solaris,所以无法判断..虽然你可以使用重定向:sed "s/$1/$2/g" "$i" >"$i".bak && mv "$i".bak "$i"
    • 很好,这样就可以了
    猜你喜欢
    • 2017-03-07
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 2014-08-01
    • 2013-11-01
    • 1970-01-01
    相关资源
    最近更新 更多