【问题标题】:sed creates duplicate line instead of replacing existing linesed 创建重复行而不是替换现有行
【发布时间】:2014-07-07 04:49:12
【问题描述】:

我有一个包含以下内容的文件 (foo.txt):

some-text 0

我使用以下 sed 命令将 0 替换为 1:

search_text="some-text";
sed "s/${search_text} 0/${search_text} 1/" -i foo.txt;

这导致 foo.txt 包含:

some-text 0
some-text 1

如何让它替换找到的行而不是追加新行?

它发生在 SL06 上的 GNU sed 版本 4.2.1 中。

【问题讨论】:

  • 您的行是否以回车结束?我能想到的唯一解释是行不完整时的未定义行为。取决于您的环境和工具版本。
  • 拥有 CR/NL 似乎没有什么不同。
  • 似乎在这里工作。也许实际的“某些文本”包含一些sed 命令?
  • 这似乎无法重现。如果您使用问题中的示例,您的系统是否会出现相同的行为?
  • 在对文件使用 sed 之前尝试使用 dos2unix foo.txt

标签: bash text replace sed


【解决方案1】:

如果你想试试awk

awk '/some-text/ {$2=1} 1' file

【讨论】:

  • 这给了我同样的行为。还添加了具有正确值的行,而不是替换现有值。
  • 这就是你所要求的。搜索some-text,然后将值设置为1 并打印全部。您可以这样做来搜索其0 awk '/some-text/ {$2=1} 1' file > tmp && mv tmp file 是否更新原始文件。
【解决方案2】:

你试试

search_text='some-text'
sed -e "s/\(${search_text}\) 0/\1 1/" -i foo.txt

使用组模式而不是搜索文本的两倍

您正在使用哪个 shell(因为我看到 ;c 行尾不经常在 shell 的几行中使用)?

【讨论】:

    猜你喜欢
    • 2016-09-17
    • 2010-11-29
    • 2016-01-23
    • 2013-01-11
    • 2011-10-04
    • 2019-08-25
    • 2020-10-29
    • 2014-06-21
    • 1970-01-01
    相关资源
    最近更新 更多