【问题标题】:Adding a line to a file using sed in a shell script在 shell 脚本中使用 sed 向文件中添加一行
【发布时间】:2020-07-12 12:20:55
【问题描述】:

我有一个有 109 行的文件。

我在下面显示的行上执行了两个操作。

# Delete line 74
sed -i '74d' Test.txt

# Add the entry to line 109
  sed -i "109iThis is the string" Test.txt

我看到第 74 行已从我的 Test.txt 中删除,但由于某些原因,现在我的 Test.txt 只有 108 行,我没有看到 This is the string 被添加到第 109 行。

我不确定错误是什么。我该如何解决?

【问题讨论】:

  • 所以你从文件中删除了一行,就地,现在它少了一行。我没有看到问题。将第二个 sed 更改为命中行 108
  • 请注意,在i 之后指定字符串是 GNU-sedism 而不是 POSIX 标准。您应该有一个反斜杠换行符,然后是字符串。如果您希望在最后一行之后有新行,请使用$ 选择行号。您可以使用sed -i -e '74d' -e '$aThis is the string' Test.txt 在一个命令中执行这两项操作。 (另外,使用不带后缀的-i 是另一种GNU-sedism。使用-i 可以在BSD (macOS) 房间中使用,但前提是您指定了备份后缀——-i.bak 可以同时使用两者。)注意在你知道你的脚本工作之前使用-i是危险的——它有丢失文件的风险。
  • @JNevill 由于某些原因,当我使用 108 时,它会将其添加到 108,但将 108 条目移动到第 109 行。它仍然不起作用
  • 所以你想在最后一行之后追加,而不是在它之前插入 - i 是插入(之前); a 是附加(之后)。

标签: bash shell sed ksh


【解决方案1】:

如果删除一行,文件只剩下 108 行。相应地更正您的第二个命令:

sed -i "108iThis is the string" Test.txt

【讨论】:

  • 当我使用它时,它会移动第 108 行的条目并在第 108 行添加我的条目。但我不希望第 108 行的条目移动到第 109 行。
  • 好的,从108i(插入)切换到108a(附加)。
  • 你能解释一下吗?
  • 您的文件只剩下 108 行,这样您就可以在第 108 行之后添加所需的行。
【解决方案2】:

第 109 行不存在(您删除了一个,109-1=108),您必须添加它才能在其中输入文本。

解决方案: sed -i '$ a <text>' Test.txt 新行将与所选文本一起添加。

【讨论】:

  • 你能改写这个吗?我不确定您所说的A little different ... 是什么意思
  • 现在这样更容易理解了吗?
【解决方案3】:

你可以使用这个 POSIX sed 命令:

sed -i.bak '74d; $ a\
This is the string
' file

这将从文件中删除第 74 行并在末尾追加一行,并将内联保存更改。

请注意,这也适用于 gnu-sed

【讨论】:

  • -i 不是 POSIX,顺便说一句
【解决方案4】:

Jonathan 已经提到了使用 sed -i 的潜在问题(非标准,在支持时的行为方式取决于实现等)。通过使用ed 编辑文件来避免它们:

ed -s Test.txt <<EOF
109a
This is the string
.
74d
w
EOF

注意它是如何追加然后删除的。因为ed 作用于整个文件,而不是行流,所以作用于特定行的命令可以是任何顺序。

【讨论】:

    猜你喜欢
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2019-12-29
    • 2016-10-08
    相关资源
    最近更新 更多