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 创建重复行而不是替换现有行的主要内容,如果未能解决你的问题,请参考以下文章