迭代并更改文件的内容

时间:2017-05-28 10:07:32

标签: 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

2 个答案:

答案 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)是执行替换的所有文件。对于工作目录中的所有文件,可以是*