【问题标题】:Replace a specific line with formatted output in text file用文本文件中的格式化输出替换特定行
【发布时间】:2013-10-29 18:47:48
【问题描述】:

我有一个将数据输出到文本文件的程序,但到目前为止它只是在文件末尾连接。我想使用 printf 获取一些格式化输出并告诉 sed 或 awk 替换该 .txt 中的某一行。

我尝试了几种不同的方法。现在我正在尝试细化以 $name 开头的行并将其替换为

printf "%-12s%-9s%-9s%-12s%-9s%-14s%-10s\n" "$name" "$quiz" "$hw" "$midterm" "$final"          
                  "$numberGrade" "$letterGrade"

我正在尝试使用 sed -i /^$name/\c ... 但如果我将它设置为变量,我找不到保留 printf 格式的方法。有没有简单的方法可以做到这一点?

【问题讨论】:

  • 你能提供样本数据吗?
  • printf 函数中的变量(name、quiz、hw、midterm、final、numberGrade、letterGrade)必须按照代码块中 printf 指定的精确格式输出。要匹配的模式将是具有匹配 $name 变量的第一行。输出看起来像:Jon 89 90 45 32 72.2 C-(除了输出会像 printf 那样格式化。所以,如果一行匹配单词“Jon”,那一行将被替换为新数据。

标签: bash sed


【解决方案1】:

你应该给我们一个输入流的例子和一个预期输出的例子。

现在,一些研究元素:

  • awk 提供了 printf 函数的实现
  • 你可以试试这样的:

    formatRow=$(printf "%-12s%-9s%-9s%-12s%-9s%-14s%-10s" "$name" "$quiz" "$hw" "$midterm" "$final" "$numberGrade" "$letterGrade")
    sed -i "s/^$name.*/$formatRow/" filename
    

【讨论】:

  • 我为您的sed 表达式添加了缺少的s
  • 好的,谢谢。我尝试了几个 sed 命令,但由于某种原因无法获得一个变量来保存格式,但这有效。但是,它不会替换整行,它只会替换与 printf....hrmm 匹配的模式
  • @user2079828 :是的,试试这个,而不是我以前的 sed : sed -i "s/^$name.*/$formatRow/"
  • @IdrissNeumann 您应该更新您的答案,而不是建议在 cmets 中进行修改。
  • 我希望田野里不要有斜线……否则它会在你的脸上爆炸(或者在背后咬你,或者……)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多