Bash 迭代并更改文件的内容

Bash 迭代并更改文件的内容,bash,shell,Bash,Shell,我编写了一个脚本,它使用第一个和第二个参数字符串,其他参数是文件。该脚本的思想是在每个文件的每一行中用第二个参数替换第一个参数。这是我的实现,但它不会更改文件的内容,但会打印正确的信息 first=$1 second=$2 shift 2 for i in $*; do if [ -f $i]; then sed -i -e 's/$first/$second/g' $i fi done 您的脚本不会更改文件,因为您只是简单地打印到标准输出,而不是文件。按照您的方式,您

我编写了一个脚本,它使用第一个和第二个参数字符串,其他参数是文件。该脚本的思想是在每个文件的每一行中用第二个参数替换第一个参数。这是我的实现,但它不会更改文件的内容,但会打印正确的信息

first=$1
second=$2
shift 2
for i in $*; do
  if [ -f $i]; then
        sed -i -e 's/$first/$second/g' $i
  fi
done

您的脚本不会更改文件,因为您只是简单地打印到标准输出,而不是文件。按照您的方式,您需要一个新变量逐字存储新内容,然后通过重定向将其回显到原始文件(

但您只需使用
sed
,即可实现这一点,如下所示:

sed-i''s/original/new/g'文件

说明:

sed
是一个流编辑器

-i'
表示它将编辑当前文件,并且不会创建任何备份

s/original/new/g
表示用
new
word或regexp替换
original
word或regexp。
g
表示全局=替换所有发生的事件,而不仅仅是每行的第一个


文件
是执行替换的所有文件。可以是工作目录中所有文件的
*

您使用了一个引号来括起sed命令。因此,忽略了美元符号(参数扩展)的特殊含义,将其视为简单字符。 查看bash手册:

将字符括在单引号中会保留引号中每个字符的文字值。 ... 将字符括在双引号中会保留引号中所有字符的文字值,除了$、`、\,以及在启用历史扩展时

应将其替换为双引号:

sed -i -e "s/$first/$second/g" $i

我已经用sed更改了代码,奇怪的是它仍然没有做出更改:?哦,我现在在你的问题中看到了。我发布的sed命令就是您所需要的,不要把它放在脚本中,只运行这个命令,它就会工作。不需要这些循环等。是的,这就是原因:)