【问题标题】:Using SED to modify the nth line of a file使用 SED 修改文件的第 n 行
【发布时间】:2015-07-13 12:11:46
【问题描述】:

如果我想在文件的第 10 行添加内容,我该怎么做?

这是我想出的:

sed -ie '' "10s/^/new_content/g" file.txt

我不断收到消息“没有这样的文件或目录”

另外,如果我想用 N+1 替换 10,用变量 $VAR 替换 new_content,格式是否仍然相同?

VAR= $(cat fileA.txt)
sed -ie '' "`expr $N +1`s/^/$VAR/g" fileB.txt

感谢您的帮助!!!

【问题讨论】:

  • sed -ie 表示sed 将通过将扩展名e 添加到原始文件名来为您创建备份文件。没有正式错误,但非常难以置信。你的空字符串'' 是一个空的sed 脚​​本;这后面是一个“文件名”,例如3/^/something/g,它可能不存在,然后是final.txt。 Shell 有一个完全可行的elif,应该使用它。 fi 之后的分号是不必要的。如果您包含一对简短的样本输入(原始输入,似乎是 length.txtfinal.txt,加上预期的输出,这将无济于事。
  • 对不起,我删除了原始代码,以便我可以坚持线程的原始上下文。我会尝试 elif 看看会发生什么。
  • elif 是(曾经)风格,不是实质性的。您可以使用elif ... then; ...; fi 代替else if ... then; ...; fi; fi; — 它减少了fi 的数量和缩进量。
  • 感谢 sed -ie 的评论。我没有尝试进行备份。我试图调用 -i 和 -e。
  • 在 Mac 上,-i 选项需要备份后缀,可以是空字符串:-i.bak-i .bak-i ''(但不是 -i'')。使用 -i -e '…' 将为您提供扩展名为 -e 的备份。请注意,GNU sed-i 有不同的语义;使用-i.bak 为您提供带有.bak 扩展名的备份; -i 本身意味着没有扩展的备份。如果脚本要在 Mac 和 GNU sed 上运行,则必须使用 -i.bak 以使脚本可靠运行(.bak 的拼写由您选择,但必须存在且非空)。 (我的意思是:外壳 对间距很挑剔)。

标签: macos sed terminal


【解决方案1】:

Shell 对间距很挑剔:

VAR= $(cat fileA.txt)

您不想要= 后面的空格。实际上,您也不需要分配,除非fileA.txt 只有一行。您必须使用反斜杠等转义换行符才能使其正常工作,这既困难又不必要。

除非您使用的是古董(非 POSIX)shell,否则请使用内置算术:

sed -i.bak -e "$(($N + 1))r fileA.txt" fileB.txt

$(($N + 1)) 让 shell 计算算术表达式。 rsed 读取了被命名的文件。

[1addr]r file
在下一次尝试读取输入行之前将文件的内容复制到标准输出。如果由于任何原因无法读取文件,则会静默忽略该文件,并且不会设置错误条件。

【讨论】:

  • 空格是错字。哎呀。 fileA.txt 只有 1 行。
  • 小心——shell 不会知道这是一个拼写错误,我们只能注意您向我们展示的内容;这是一个普遍的问题......
【解决方案2】:

原来我需要拆分-i-e

最终的结果是:

        sed -i '' -e "10s/^/CONTENT/g" file.txt

或者每次循环时将 Ns 增加 +1:

        sed -i '' -e "$((N + 1))s/^/CONTENT/g" ~/dance/heatlist/prep.txt

我还没有弄清楚如何让 CONTENT 成为变量 $CONTENT

【讨论】:

  • 请不要使用反引号,这不仅是因为它们在 cmets 的 Markdown 中难以处理。并且不要在现代代码中使用expr
猜你喜欢
  • 2019-07-12
  • 2015-03-19
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 2014-02-02
  • 2014-07-20
相关资源
最近更新 更多