【发布时间】: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 命令来做到这一点呢?
【问题讨论】:
标签: sed
我在文件中使用 sed 命令进行替换。 假设我的 file1 是:
10
11
10
11
然后我想将file1中的第一个“10”替换为“12”,然后转储到file2。 file2 应该是:
12
11
10
11
我试过这个命令:
sed 's/10/12/' file1 >file2
但它也改变了第二个“10”。那么,我该如何编写 sed 命令来做到这一点呢?
【问题讨论】:
标签: sed
如果您可以使用 awk 代替 sed,您可以像这样拥有更多控制权:
awk '!changed && /10/ { sub(/10/, "12"); changed = 1}1' file1
12
11
10
11
【讨论】:
尝试:
sed '0,/10/s/10/12/' file1 >file2
【讨论】:
就像 GriffinG 说的,你可以这样做:
sed '0,/10/ s/10/12/' file1 > file2
开头的0,/10/ 设置了以下替换命令的界限。它说从第 0 行(第一行)开始,一直到与模式 /10/ 匹配的一行。因此,在第一次匹配之后,sed 将停止处理该替换。
【讨论】:
0,/.../ 仅适用于 GNU sed
如果您没有 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/,因此不需要额外的空行
【讨论】: