我编写了一个脚本,它接受第一个和第二个参数字符串,其他参数是文件。脚本的想法是用每个文件的每一行中的第二个参数替换第一个参数。这是我的实现,但是它不会更改文件的内容,但会打印正确的信息
first=$1
second=$2
shift 2
for i in $*; do
if [ -f $i]; then
sed -i -e 's/$first/$second/g' $i
fi
done
答案 0 :(得分:1)
您使用单引号括起sed命令。因此,忽略美元符号(参数扩展)的特殊含义,并将其视为简单字符。 查看bash手册:
用单引号括起字符可保留引号中每个字符的字面值。 ...用双引号括起字符会保留引号内所有字符的字面值,但$,`,\除外,并且,当启用历史记录扩展时,!。
您应该用双引号替换它们:
sed -i -e "s/$first/$second/g" $i
答案 1 :(得分:0)
您的脚本不会更改文件,因为您只是打印到stdout而不是文件。他们这样做,您需要一个新变量来逐字存储新内容,然后通过重定向(>
)将其回显到原始文件。
但是您可以使用sed
完成此操作,如下所示:
sed -i '' 's/original/new/g' file(s)
说明:
sed
是一个流编辑器
-i ''
表示它将编辑当前文件并且无法创建任何备份
s/original/new/g
表示将original
字或正则表达式替换为new
字或regexp。 g
表示全局=替换所有发生的事件,而不仅仅是每行的第一个
file(s)
是执行替换的所有文件。对于工作目录中的所有文件,可以是*
。