sed 创建重复行而不是替换现有行

Posted

技术标签:

【中文标题】sed 创建重复行而不是替换现有行【英文标题】:sed creates duplicate line instead of replacing existing line 【发布时间】: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 【参考方案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 的几行中使用)?

【讨论】:

以上是关于sed 创建重复行而不是替换现有行的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React Hooks 中向表中添加行而不重复?

删除重复行而不排序[重复]

三剑客(sed awk head)

MySQL连接和连接行而不重复条目[重复]

从文件中读取行而不在末尾附加“\ n”[重复]

向红移表添加行而不是替换表