我使用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
有什么想法吗?
答案 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 所建议的那样,“命令嵌套”可能不安全,例如,在这种情况下,如果某些文件名包含空格。