我在使用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覆盖以前的值。有什么建议吗?
答案 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来更改foo
中bar
的{{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"
周围的双引号:如果其中一个变量包含空格,则会阻止命令中断。
进一步评论:
-i
选项。您的正则表达式目前会替换匹配行中!cats!
后的所有内容。如果他们在你的线路上发生了几次!cats!
,那么只剩下一个。{1}}。如果您只想替换两个!
分隔符之间的值,则可以考虑使用以下sed
命令:
sed 's/!cats![^!]*/!cats!300/g'