替换选项:sed 命令中的 s [重复]

Posted

技术标签:

【中文标题】替换选项:sed 命令中的 s [重复]【英文标题】:Substitution option: s in sed command [duplicate] 【发布时间】:2014-05-31 16:34:35 【问题描述】:

我在文件中使用 sed 命令进行替换。 假设我的 file1 是:

10
11
10
11

然后我想将file1中的第一个“10”替换为“12”,然后转储到file2。 file2 应该是:

12
11
10
11

我试过这个命令:

sed 's/10/12/' file1 >file2

但它也改变了第二个“10”。那么,我该如何编写 sed 命令来做到这一点呢?

【问题讨论】:

【参考方案1】:

如果您可以使用 awk 代替 sed,您可以像这样拥有更多控制权:

awk '!changed && /10/  sub(/10/, "12"); changed = 11' file1
12
11
10
11

【讨论】:

【参考方案2】:

尝试:

sed '0,/10/s/10/12/' file1 >file2

【讨论】:

这将完成这项工作,但您应该解释它的作用以及它完成工作的原因。【参考方案3】:

就像 GriffinG 说的,你可以这样做:

sed '0,/10/ s/10/12/' file1 > file2

开头的0,/10/ 设置了以下替换命令的界限。它说从第 0 行(第一行)开始,一直到与模式 /10/ 匹配的一行。因此,在第一次匹配之后,sed 将停止处理该替换。

【讨论】:

0,/.../ 仅适用于 GNU sed【参考方案4】:

如果您没有 GNU sed,请尝试:

echo | cat - file | sed '1,/10/s/10/12/; 1d'

sed '1,/10/s/10/12/; 1d' << EOF

$(cat file)
EOF

或在bash / ksh93

sed '1,/10/s/10/12/; 1d' <(echo; cat file)

GNU sed 知道0,/10/,因此不需要额外的空行

【讨论】:

以上是关于替换选项:sed 命令中的 s [重复]的主要内容,如果未能解决你的问题,请参考以下文章

替换换行符 sed [重复]

通过 ssh 连接的 sed + `s' 的未知选项 [重复]

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

AIX 脚本中的 sed 不适用于特殊字符 [重复]

使用grep和sed递归查找和替换所有文件中的字符串[重复]

sed中未终止的`s'命令[重复]