sed没有写入文件

时间:2014-06-16 19:29:10

标签: bash sed

我在使用sed替换值并写入新文件时遇到问题。它写入新文件,但无法更改任何值。这是我的代码:

cd/mydirectory  

echo "Enter file name:"
read file_input

file1= "$file_input"
file1= "$file1.b"

file2= "$file_input"
file2= "${file2}Ins.b"

sed "/\!cats!/s/\!cats!.*/cats!300!/g $file1>$file2

我只想用值为300的猫替换任何文本。每当我运行此脚本时,它都不会用300覆盖以前的值。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

尝试更改

sed "/\!cats!/s/\!cats!.*/cats!300!/g $file1>$file2

sed "s/cats.*/cats300/g" $file1 > $file2

要替换文字,您通常必须使用sed "s/foo/bar/g" file_in > file_out之类的sed来更改foobar的{​​{1}}的所有匹配项,并将输出重定向到{{1} }}。


修改

我注意到你正在将输出重定向到同一个文件 - 你不能这样做。您有两个选择:

  • 将结果重定向到另一个文件,文件名不同。 e.g:

    file_in

    请注意file_out

  • 之后的sed "s/cats.*/cats300/g" $file1 > $file2.tmp
  • 使用.tmp标志(如果使用GNU sed):

    $file2

    -i代表内联替换

答案 1 :(得分:0)

我认为您脚本的这个修改版本应该有效:

echo "Enter file name:"
read file_input

file1="$file_input"     # No space after '='
file1="$file1.b"        # No space after '='

file2="$file_input"     # No space after '='
file2="${file2}Ins.b"   # No space after '='

sed 's/!cats!.*/!cats!300!/g' "$file1" > "$file2"

请注意sed表达式周围的单引号:使用它们,无需转义表达式中的!。另请注意"$file1""$file2"周围的双引号:如果其中一个变量包含空格,则会阻止命令中断。

进一步评论:

  • 正如jim所指出的,您可能希望使用GNU sed -i选项。
  • 您的正则表达式目前会替换匹配行中!cats!后的所有内容。如果他们在你的线路上发生了几次!cats!,那么只剩下一个。{1}}。如果您只想替换两个!分隔符之间的值,则可以考虑使用以下sed命令:

    sed 's/!cats![^!]*/!cats!300/g'