sed string replace会给出某种警告吗?

时间:2014-07-14 14:59:53

标签: regex bash shell sed grep

我使用sed with grep命令替换字符串。旧字符串位于家庭位置的8个文件中,我想用新字符串替换所有这些。我正在使用这个:

#! /bin/bash

read oldstring
read newstring 

sed -i -e 's/'Soldstring'/'$newstring'/' grep "$oldstring" /home/*

现在这个命令有效,但我收到警告:

sed: can't read grep: No such file or directory
sed: can't read oldstring: No such file or directory

有什么想法吗?

5 个答案:

答案 0 :(得分:2)

你可能想要

sed -i -e "s|Soldstring|$newstring|" $(grep -l "$oldstring" /home/*)

然而,这种形式是不安全的。更好地使用xargs:

grep -l "$oldstring" /home/* | xargs sed -i -e "s|Soldstring|$newstring|"

如果可能的话,另一个是存储在数组上:

readarray -t files < <(exec grep -l "$oldstring" /home/*)
sed -i -e "s|Soldstring|$newstring|" "${files[@]}"

答案 1 :(得分:0)

您没有执行grep,而是将其作为参数提供给sed

答案 2 :(得分:0)

你错过了反叛吗?

sed -i -e 's/'Soldstring'/'$newstring'/' `grep "$oldstring" /home/*`

答案 3 :(得分:0)

 sed -i -e "s/$oldstring/$newstring/g" `grep -l "$oldstring" /home/*`

答案 4 :(得分:0)

为了清楚地指出代码中的各种拼写错误

 #! /bin/bash
 # ^
 # extra space here (not really an error I think -- but unusual)

 read oldstring
 read newstring 

 sed -i -e 's/'Soldstring'/'$newstring'/'    grep "$oldstring" /home/*
 #             ^                          ^                             ^
 #    `S` instead of `$` here             |                             |
 #                                       here         and             there
 #                                             missing backticks (`)    

作为旁注,我建议上面的反引号,但是,由于您使用的是bash,因此语法$(grep ....)可能比传统的Bourne Shell语法更好{{} 1}}。最后,正如 konsolebox 所建议的那样,“命令嵌套”可能不安全,例如,在这种情况下,如果某些文件名包含空格。