用一个字符串替换文本文件中的第一行

90

我是一个shell脚本的新手,不清楚如何使用sed或其他工具将文本文件中的第一行替换为特定字符串。以下是文本文件内容:

/home/snehil/Desktop/j1/movie.MOV
"一些其他文本行"

我想用movie.MOV(可以是shell脚本中的变量)来替换第一行(电影文件路径)。

请指导我如何做到这一点。我在一些帖子中看到了sed,我需要在这里使用sed吗?

2个回答

180

sed是正确的工具,尝试执行:

var="movie.MOV"
sed -i "1s/.*/$var/" file.txt

解释

  • 1 表示第一行
  • 剩下的部分是替换语法 s/// : 我们用变量 $var 替换所有内容 (.*)
  • 这里双引号必须使用

学会如何在 shell 中正确引用,这非常重要:

对于包含空格/元字符和每个扩展的字面值,请“双引号”:"$var", "$(command "$var")", "${array[@]}", "a & b"。对于代表代码或字面值的单个 $,请使用 '单引号'$'s: 'Costs $5 US', ssh host 'echo "$HOSTNAME"'。参见:
http://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words


1
如果提问者真正想要的是剥离文件名,您也可以使用1s:.*/::来除去除文件名以外的所有内容。 - Dietrich Epp
2
你好Sputnick,我正在尝试你的解决方案: 但是我得到了以下错误char 9:无法识别`s'选项.............这是我的代码..........#!/bin/sh topDirectoryPath="$ 1" metaFileName="movie_meta.txt" replaceName="$ 2" myMetaFilePath="$ topDirectoryPath $ metaFileName" sed"1s/.*//$ replaceName/" /home/snehil/Desktop/j1/Erasure/Coding/movie_meta.txt - Rookie
1
谢谢!我在终端中获取了文件“echoed”的新内容...但是我该如何将其写入同一文件中?即将新内容写入同一文件中?我尝试将sed保存在变量中并使用>运算符..不起作用:( - Rookie
9
你可以使用sed命令的-i选项来直接编辑文件,例如: sed -i '.bak' "1s/.*/${var}/" file.txt 这将会直接在文件中进行编辑,并且创建一个备份文件( .bak )。如果您不需要备份文件,则只需将-i选项的参数留空即可,示例代码如下: sed -i '' "1s/.*/${var}/" file.txt - Sam Figueroa
1
如果我的新行包含“/”,我该怎么办? - Shrikant Shete
显示剩余5条评论

6
你可以使用tail轻松完成此操作:
#I want to replace the first line
cp test.txt test.txt.backup
echo 'mynewfirstline'> test.txt
#add everything from old file starting from second line
cat test.txt.backup |tail -n+2>> test.txt

对于大文件来说,这感觉很慢,使用它比使用sed更快还是更慢? - Fr4nc3sc0NL
sed不是可移植的,所以对于不太大的文件来说,这显然更好。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接