Bash sed未写入文件

Bash sed未写入文件,bash,sed,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 我只是想

我在使用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替换cats后面的任何文本。无论何时运行此脚本,它都不会用300覆盖上一个值。有什么建议吗?

试试换衣服

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

要替换文本,通常必须使用sed,如
sed“s/foo/bar/g”file\u in>file\u out
,将
foo
的所有出现更改为
bar
in
file\u in
,将输出重定向到
file\u out


编辑

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

  • 将结果重定向到具有不同文件名的其他文件。e、 g:

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

  • 使用
    -i
    标志(如果使用GNU sed):

    i
    代表内联替换


我认为您的脚本的这个修改版本应该可以工作:

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
表达式周围的单引号:有了它们,就没有必要转义
表达式中的s。另请注意
“$file1”
“$file2”
周围的双引号:如果其中一个变量包含空格,这将防止命令中断

还有一些评论:

  • 正如jim所指出的,您可能需要使用GNU sed
    -i
    选项
  • 您的正则表达式当前将替换
    之后的所有内容!猫在匹配行中。如果它们是多次出现的
    !猫在您的线路上,只剩下一个。如果您只想替换两个
    之间的值分隔符,您可以考虑使用以下代码<代码SED命令:
    
    sed 's/!cats![^!]*/!cats!300/g'
    

谢谢你的帮助。不幸的是,建议的改变没有起作用。我觉得这两种方法都应该是正确的,但遗憾的是,我似乎无法让它们发挥作用。再次感谢。@OldMopMan我相信问题在于输出文件,然后。。。您使用的文件名与输入文件相同。请删除重复的文件名定义,然后使用上述示例重试。我希望这有帮助!谢谢,更改文件名很有效,但是为什么它们是同一个输出文件?您说我将输出定向到同一个文件,但是$file1和$file2不应该是相同的$file1应该是${file1}.b,$file2应该是${file2}Ins.b。Ins不应该使用不同的文件名吗?@OldMopMan是的,关于文件名,你是对的-我只是认为那些定义文件名的行有点误导,因为你对每一行都定义了两次。在尝试新的东西时,我总是尽可能地使用最简单可行的脚本,只是为了测试我正在寻找的功能是否有效。如果这行得通的话,那么我试着围绕它构建其他东西。谢谢。是的,我真的不该给他们下两次定义。无论如何,当sed语句中的每个变量后面都硬编码了.tmp时,它可以工作,但如果我尝试将文件扩展名(.tmp)放入变量中,则它不起作用,例如:file2=“${file2}.tmp”您有那些
在您的文件中?此外,您应该在
sed
行中用双引号括起
“$file1”
“$file2”
。不确定它是否能解决您的问题,但如果文件名包含空格,它至少可以防止您的脚本格式被破坏。(说到双引号,您的
sed/../s/../
表达式末尾缺少一个引号。)并删除
file1/2=“…”
行中
=
符号后的空格。@qole感谢您的帮助。sed-i“s/cats.*/cats300/g“$file1这对我来说也很有效,但是有人能解释为什么重定向不起作用,尽管它看起来也一样吗?你是说像
sed's/foo/bar/'$file1>$file1
这样的东西为什么不起作用?这是因为文件在
sed
开始读取之前被截断,因此您将处理一个空文件(请参见示例)。或者你是说别的什么?谢谢,我也是这个意思
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 's/!cats![^!]*/!cats!300/g'